2016-03-24 3 views
-1

Я читаю байты из файла. В этом примере я прочитал два байта (представлены в гекса)объединение двух байтов

94 и 73. Как я могу поместить эти два байта вместе, чтобы они выглядели как

9470?

Я могу использовать 73 >> 4, чтобы сделать 70 из 73 Но как я могу «сместить» их вместе?

Я попытался с помощью (94 << 8) & (73 >> 4), но он всегда возвращает 0.

я нашел ничего о работе с байтами, как это. (Основное чтения одного и половина байта в данном примере), чтение 2 байта сразу

примера кода

uint64_t bytes; 
output.read((char *)&bytes, 2); // read 2 bytes 
uint64_t tmp  = (cutIt << (64 - 8)) >> (64 - 8) ; 
uint64_t tmp_two = ((cutIt >> 8) & 11110000) >> 4; 
uint64_t tmp_three = (tmp << 8) & tmp_two ; 
+0

вы можете показать код .... могут быть разные способы. – tod

+1

Возможно, вы хотели сделать '(94 << 8) | 73', что означает сдвиг первого байта на 8 бит и сделать BITWISE OR с 73 (второй байт) – johngull

+0

, этот результат 5e49, не нужен результат – user3706129

ответ

2
((94 << 8)+74) & (FFF0) 

даст вам вывод, который вы хотите. для этого вам нужно думать двоично.

((10010100 <<8) + 01110100) & (1111111111110000) 

4 нули в конце будут обнулять ваш LSB благодаря логическому И и поддерживать слово legth.

Чтобы ответить на комментарий:, вы просто выбрали нумер бит, который вы хотите использовать, изменив количество нулей. Для примера это будет означать номер, используемый для логического И будет FFFC в шестнадцатеричном или в двоичном 1111111111111100.

+0

как бы код отличался, если бы я хотел загрузить 1 байт и скажем, 6 бит? (мой пример был 1 байт и 4 бита) – user3706129

0
byte b1 = 0xAB; 
byte b2 = 0xCD; 
... 
short s = (short)(b1<<8) | ((short)(b2<<4) & 0xF0); 
//s = ABC0 

использования или (|) вместо и (&) слить сдвинутые значения вместе в противном случае всегда 0.

+1

должно быть 'b2 << 4' not 8 –

+0

Да, вы правильно исправили его – Schafwolle

Смежные вопросы