2012-02-10 2 views
0

Я читаю в двоичном файле (в C++). А заголовок что-то вроде этого (в шестнадцатеричном формате)Двоичная интерпретация файла

43 27 41 1A 00 00 00 00 23 00 00 00 00 00 00 00 04 63 68 72 31 FFFFFFB4 01 00 00 04 63 68 72 32 FFFFFFEE FFFFFFB7

при печати с использованием:

std::cout << hex << (int)mem[c]; 

есть ли эффективный способ хранения 23 который является 9th байт в целое число без использования stringstream (?)? Или stringstream лучший способ?

Что-то вроде

int n= mem[8] 

Я хочу, чтобы хранить 23 в n не 35.

+1

что такое 'mem'? – PlasmaHH

+1

Что вы хотите сохранить, когда значение равно '1A'? –

+0

mem is char * mem; – Robert

ответ

1

Вы хотите, чтобы вы считали значение двоично-десятичным десятичным? В этом случае вы можете преобразовать его, используя что-то вроде:

unsigned char bcd = mem[8]; 
unsigned char ones = bcd % 16; 
unsigned char tens = bcd/16; 

if (ones > 9 || tens > 9) { 
    // handle error 
} 

int n = 10*tens + ones; 
5

Вы сохранили 23 в n. Вы видите только 35, потому что вы выводите его с помощью процедуры, которая преобразует ее в десятичную для отображения. Если бы вы могли смотреть на двоичных данных внутри компьютера, вы увидите, что это на самом деле шестигранной 23.

Вы получите тот же результат, как если бы вы сделали:

int n=0x23; 

(То, что вы могли бы думаю, что вы хотите, невозможно. Какой номер должен быть сохранен в n для 1E? Единственное соответствующее число - 31, что вы получаете.)

+0

Если вы можете посмотреть на двоичные данные, вы увидите, что это фактически '0000 0000 0010 0011' (или' 0011 0010 0000 0000', или 64-разрядные эквиваленты или т. Д.). Он был преобразован так же, как и отображать его в шестнадцатеричном виде, поскольку он должен отображать его в десятичном формате. Я всегда считаю, что это указывает на то, что люди понимают, что в целочисленной переменной нет встроенной базы (отличной от двоичной). –

+0

У меня на самом деле было это в черновом ответе, но я не мог найти способ сделать его понятным. Но вы совершенно правы, и это важный момент. –

+0

Я понимаю это, но на самом деле я хочу использовать номер 23 позже в коде. Итак, как может, например, цикл 23 раза, а не 35 раз (это число, которое я получаю). – Robert

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