Помогите с переводом шестнадцатеричных чисел
int a здесь будет число
sscanf(str, "%x", &a) кладем число из строки в переменную
char str[...] здесь стока с числом
int a здесь будет число
sscanf(str, "%x", &a) кладем число из строки в переменную
код
int g;
STR = StringGrid1->Cells[1][15];
char STRc = STR[3];
sscanf(STRc, "%x", &g); (строка №424)
Выдал такие ошибки:
[C++ Error] UnitOCR.cpp(424): E2034 Cannot convert 'int' to 'const char *'
[C++ Error] UnitOCR.cpp(424): E2342 Type mismatch in parameter '__buffer' (wanted 'const char *', got 'char')
int Hi; // holds high byte
int Lo; // holds low byte
int Result; // holds result
// Get the value of the first byte to Hi
Hi = pChars[0];
if ('0' <= Hi && Hi <= '9') {
Hi -= '0';
} else
if ('a' <= Hi && Hi <= 'f') {
Hi -= ('a'-10);
} else
if ('A' <= Hi && Hi <= 'F') {
Hi -= ('A'-10);
}
// Get the value of the second byte to Lo
Lo = pChars[1];
if ('0' <= Lo && Lo <= '9') {
Lo -= '0';
} else
if ('a' <= Lo && Lo <= 'f') {
Lo -= ('a'-10);
} else
if ('A' <= Lo && Lo <= 'F') {
Lo -= ('A'-10);
}
Result = Lo + (16 * Hi);
return (Result);
}
Классика:
int Hi; // holds high byte
int Lo; // holds low byte
int Result; // holds result
// Get the value of the first byte to Hi
Hi = pChars[0];
if ('0' <= Hi && Hi <= '9') {
Hi -= '0';
} else
if ('a' <= Hi && Hi <= 'f') {
Hi -= ('a'-10);
} else
if ('A' <= Hi && Hi <= 'F') {
Hi -= ('A'-10);
}
// Get the value of the second byte to Lo
Lo = pChars[1];
if ('0' <= Lo && Lo <= '9') {
Lo -= '0';
} else
if ('a' <= Lo && Lo <= 'f') {
Lo -= ('a'-10);
} else
if ('A' <= Lo && Lo <= 'F') {
Lo -= ('A'-10);
}
Result = Lo + (16 * Hi);
return (Result);
}
Большое человеческое СПАСИБО.
Работает.
код
int g;
STR = StringGrid1->Cells[1][15];
char STRc = STR[3];
sscanf(STRc, "%x", &g); (строка №424)
Выдал такие ошибки:
[C++ Error] UnitOCR.cpp(424): E2034 Cannot convert 'int' to 'const char *'
[C++ Error] UnitOCR.cpp(424): E2342 Type mismatch in parameter '__buffer' (wanted 'const char *', got 'char')
int g;
STR = StringGrid1->Cells[1][15];
char *STRc = STR.c_str()[3];
sscanf(STRc, "%x", &g); (строка №424) - номер строчки это лишняя информация
Тут возникла еще одна заморочка. У меня в StringGrid с Cells[1][108] по Cells[1][275]записаны двоичные значения в виде "Yes", "No" (одно значение на ячейку). Нужно их читать оттуда по восемь, конвертировать и полученный байт писать в файл (всего 21 байт). Я делаю так:
e=108;
while (e<=268){
a=7; g=0;
for (d=e+7; d>=e; d--){
STR = StringGrid1->Cells[1][d];
b=STR[1];
if (b>='Y'){b=1;}else if (b<='N'){b=0;}
g=g+(2^a*b);
a=a-1;}
FileWrite(f,&g,1); e=e+8;}
Компилятор не ругается, но в файл пишется совсем не то, что нужно. Похоже, я опять заморочился с типами данных (if (b<'Y'){b=0;}else {b=1;}). b задекларирована как int.
Юра.
Юра.
Николай, спасибо, ошибку понял.
Тут возникла еще одна заморочка. У меня в StringGrid с Cells[1][108] по Cells[1][275]записаны двоичные значения в виде "Yes", "No" (одно значение на ячейку). Нужно их читать оттуда по восемь, конвертировать и полученный байт писать в файл (всего 21 байт). Я делаю так:
e=108;
while (e<=268){
a=7; g=0;
for (d=e+7; d>=e; d--){
STR = StringGrid1->Cells[1][d];
b=STR[1];
if (b>='Y'){b=1;}else if (b<='N'){b=0;}
g=g+(2^a*b);
a=a-1;}
FileWrite(f,&g,1); e=e+8;}
Компилятор не ругается, но в файл пишется совсем не то, что нужно. Похоже, я опять заморочился с типами данных (if (b<'Y'){b=0;}else {b=1;}). b задекларирована как int.
Юра.
Попробуй так
char ch;
int b, g;
for(int i = 108; i <= 268; i++)
{
g = 0;
for(int j = 0; j < 8l; j++)
{
ch = StringGrid1->Cells[1][d].c_str()[0];
//0 - первый символ, а не 1
b = (ch == 'Y')? 1: 0;/*если возможные значения только Yes и No то достаточно проверить на соответствие с одним из них*/
g |= b << 8-j;
}
или короче
for(int i = 108; i <= 268; i++)
{
g = 0;
for(int j = 0; j < 8l; j++)
{
ch = ;
//0 - первый символ, а не 1
/*если возможные значения только Yes и No то достаточно проверить на соответствие с одним из них*/
g |= (StringGrid1->Cells[1][d].c_str()[0] == 'Y') << 8-j;
}
Так точнее будет
или короче
for(int i = 108; i <= 268; i+=8)
{
g = 0;
for(int j = 0; j < 8; j++)
{
ch = ;
//0 - первый символ, а не 1
/*если возможные значения только Yes и No то достаточно проверить на соответствие с одним из них*/
g |= (StringGrid1->Cells[1][i+j].c_str()[0] == 'Y') << 8-j;
}
Юра.