Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.171.12] |
|
Сообщ.
#1
,
|
|
|
Подскажите какую функцию использовать в CW, чтобы получить значение HEX символа и наоборот (HEX -> символ)
и если можно пример. |
Сообщ.
#2
,
|
|
|
гы, канешна можна.
Вот пример. //Получение НЕХ символа char ch = 'a'; char h; h = ch; //и наоборот (HEX -> символ) char ch; char h = 0x61; ch = h; |
Сообщ.
#3
,
|
|
|
Не работает
он h присваивает 'a' |
Сообщ.
#4
,
|
|
|
Гм-м, странно... Даже не знаю что посоветовать...
Под отладчиком надо пройтись. Поскольку случай очень странный, CodeWarrior отладчик здесь не поможет. Надо GDB прикрутить. |
Сообщ.
#5
,
|
|
|
Чёто я не пойму, Шуба, ты прикалываешься?
Int16 da = 97; char aq = (char)da; char aq = 'a'; Int16 da = (Int16)aq; |
Сообщ.
#6
,
|
|
|
А я вообще чё-то не догоняю сути вопроса.
Denfox777, можно поподробнее, что хотим получить? |
Сообщ.
#7
,
|
|
|
Объясняю, надо переконвертировать char в hex и наоборот.
Задачка не из простых. Thunder, ты часом не знаешь как это сделать? Мож функцию какую-нибудь подскажешь? |
Сообщ.
#8
,
|
|
|
Цитата Объясняю, надо переконвертировать char в hex и наоборот. Задачка не из простых. Подождите ребята, что значит переконвертировать char в hex?? Char - это вам не число какое-нибудь, чтобы его в другие системы исчисления ковертировать. Я так понял автор топика хочет получить аски-код символа. Если так, то я привел пример, как это сделать. |
Сообщ.
#9
,
|
|
|
Цитата debugx @ Цитата Объясняю, надо переконвертировать char в hex и наоборот. Задачка не из простых. Подождите ребята, что значит переконвертировать char в hex?? Char - это вам не число какое-нибудь, чтобы его в другие системы исчисления ковертировать. Я так понял автор топика хочет получить аски-код символа. Если так, то я привел пример, как это сделать. Э, нет. Тут не все так просто. Для получения аски-символа никаких дополнительных действий делать не надо. Но автор хотел именно "переконвертировать". Судя по тому, что он (автор) уже не отвечает, то он все-таки нашел способ правильной "переконвертации". И решением даже не поделился. |
Сообщ.
#10
,
|
|
|
shub@
Решение пока не нашел debugx СПАСИБО!!! за пример получение аски-символа Но в отладчике же можно посмотреть значение как HEX, как Character значит есть какая то функция чтобы получить HEX значение символа |
Сообщ.
#11
,
|
|
|
Цитата Denfox777 @ Но в отладчике же можно посмотреть значение как HEX, как Character значит есть какая то функция чтобы получить HEX значение символа Сдаюсь. Запишите мне поражение. |
Сообщ.
#12
,
|
|
|
StrIToH Function
Purpose Convert an integer to hexadecimal ASCII. char *dds = ... dds = StrIToH(dds, 97); // dds = "000000061" как обратно, не нашел. Да и смысла нет в обратном преобразовании, ведь всегда будет в наличие само число, с которым ведется работа. Если же надо распарсить чары с числом в виде хекса внутри, то это только если самому писать функцию. |
Сообщ.
#13
,
|
|
|
Ага, всё, въехал
Держите, здесь есть поддержка bin, oct, hex Вывод в строку, вроде, без лидирующих нулей - если надо, то доработай сам /**********************************************************************/ #define bits_bin 1 #define bits_oct 3 #define bits_hex 4 Char* POSUtils_StrIToAHOB(Char* s, void* v, UInt16 size, UInt16 bits); void POSUtils_StrAHOBToI(Char* s, void* v, UInt16 size, UInt16 bits); /**********************************************************************/ Char* POSUtils_StrIToAHOB(Char* s, void* v, UInt16 size, UInt16 bits) { UInt32 value = (size == sizeof(UInt32)) ? *(UInt32*)v : ((size == sizeof(UInt16)) ? *(UInt16*)v : *(UInt8*)v); Char* text = s; if (value == 0) { *text++ = '0'; } else { Boolean nonZeroSeen = false; UInt32 mask = (0x0000000FUL << (32 - bits)) >> (32 - size * 8); UInt32 shift = (size * 8) % bits; UInt16 count = (size * 8) / bits; UInt16 i; if (shift == 0) shift = bits; if (shift != bits) count++; for (i = 0; i < count; i++) { UInt32 digit = (value & mask) >> (size * 8 - shift); if (digit != 0 || nonZeroSeen) { *text++ = (digit <= 9) ? digit + '0' : digit - 10 + 'A'; nonZeroSeen = true; } value <<= shift; shift = bits; } } *text = nullChr; return s; } /**********************************************************************/ void POSUtils_StrAHOBToI(Char* s, void* v, UInt16 size, UInt16 bits) { Int32 result = 0; Int16 mult = 1 << bits; Int16 sign = 1; Char c = *s++; if (c == '-') { sign = -1; c = *s++; } while (c) { if (c >= '0' && c <= '9') { result = result * mult + c - '0'; } else if (c >= 'A' && c <= 'F') { result = result * mult + c - 'A' + 10; } else break; c = *s++; } result *= sign; switch (size) { case sizeof(UInt8): *(Int8* )v = (Int8) result; break; case sizeof(UInt16): *(Int16*)v = (Int16)result; break; case sizeof(UInt32): *(Int32*)v = result; break; } } Немного пояснений: Char* s - строка в которую происходит вывод / из которой считываем void* v - указатель на UInt8/UInt16/UInt32 при переводе в строку / ... на Int8/Int16/Int32 при переводе из строки UInt16 size - задаёт размер "v", т.е. при вызове этот аргумент должен быть sizeof(UInt8)/sizeof(UInt16)/sizeof(UInt32) UInt16 bits - одна из указанных выше констант Пример вызова прямого преобразования (как сделать обратное, надеюсь, догадаешься): Char text[64]; UInt32 v = 448165069; // 0x1AB674CD POSUtils_StrIToAHOB(text, &v, sizeof(UInt32), bits_hex); // в строке наше входное число в шестнадцатиричной форме, т.е. "1AB674CD" POSUtils_StrIToAHOB(text, &v, sizeof(UInt32), bits_bin); // в строке наше входное число в бинарной форме, т.е. "11010101101100111010011001101" POSUtils_StrIToAHOB(text, &v, sizeof(UInt32), bits_oct); // в строке наше входное число в восьмеричной форме, т.е. "3255472315" |
Сообщ.
#14
,
|
|
|
Denfox777
ты прикалываешься или как? есть число. и это число можно рассмотреть разными способами. можно как символ (char), можно как число - знаковое/беззнаковое (int/uint), можно как число в шестнадцатеричном виде (hex), можно как последовательность битов (bin). ежели тебе символ нужно отобразить в шестнадцатеричном виде как строку, то юзай sprintf. |