Конкатенация двух шестнадцатеричных чисел

0

Если у меня есть число шестнадцатеричных чисел (20), которые я читаю из файла, скажем так:

0a 0b bc 05 50 

Я читаю их на двух персонажах, используя,

fscanf(p,"%c",&a);
fscanf(p,"%c",&b);

где p - указатель файла, a и b - символы без знака. Теперь я хочу объединить их и сформировать один номер. Таким образом, я хочу объединить, каждый из двух шестнадцатеричных чисел и, наконец, вычислить сумму из 10 пар, так как в общей сложности 20 чисел. Как это сделать, используя C++?

Я попытался использовать это,

unsigned int result = (a<<24) | (b<<16)

Как мне это сделать? Благодарю!

  • 0
    Поправьте меня, если я ошибаюсь, входной файл - это двоичный файл, верно?
  • 1
    Это отформатированный текстовый файл, или вы просто читаете сырой двоичный файл?
Показать ещё 3 комментария
Теги:
algorithm

3 ответа

3

Во-первых: если ваш файл является "сырым" двоичным fscanf, вы не должны использовать fscanf для его чтения. Вместо этого используйте fread:

fread( &a, sizeof( a ), 1, p );
fread( &b, sizeof( b ), 1, p );

Второе: я не знаю вашу цель, но я думаю, что вы должны "упаковать" прочитанные байты следующим образом:

unsigned int result = ( unsigned int(a) << 8 ) | b;

Или вы можете прочитать 16 бит в одном в unsigned short переменную, а затем поменять ее байтами, если это необходимо:

unsigned short a;
fread( &a, sizeof( a ), 1, p );
unsigned int result = ( (a & 0xF) << 8 ) | ( a >> 8 ); // if you need swap
unsigned int result = a; // it you don't )))
2

Поскольку это всего лишь сырые двоичные данные, вам не нужно использовать форматированный ввод-вывод или читать отдельные символы - вы можете просто прочитать пары байтов как 16-битные целые числа и суммировать их, например

uint32_t sum = 0;
for (int i = 0; i < 10; ++i)
{
    uint16_t v;

    fread(&v, sizeof(v), 1, p):
    //NB: swap high/low bytes of 'v' here if endianness is incorrect
    sum += v;
}
  • 0
    сталкивается с порядком байтов, если файл не был создан на той же платформе.
  • 0
    Спасибо - я добавлю заметку о порядке байтов.
Показать ещё 6 комментариев
0

Если ваш файл представляет собой текстовый файл, содержащий шестнадцатеричные числа, как вы показали в вашем примере, вы можете прочитать весь шестнадцатеричный номер, используя "%x" качестве строки форматирования.

int n;
while(!feof(p)){
   fscanf(p,"%x",&n);
   //no conversion needed...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню