2015-03-24 4 views
-1

У меня есть символ [] с буфером именем , данные сохраняются с использованием ifstream в двоичном режиме,символ, шестнадцатеричный, потому что он показывает FFFFFF

void File::mostrarBuffer(){ 
    for (int a = 0; a < std::strlen(buffer); a++){ 
    std::cout << std::hex << ((int)buffer[a]) << std::endl; 
    } 
    // para ver char test, only for test                
    std::cout << "===" << std::endl; 

    for (int a = 0; a < std::strlen(buffer); a++){ 
    std::cout << buffer[a] << std::endl; 
    } 

    char charTest = '\211'; 

    std::cout << "===" << std::endl; 

    std::cout << std::hex << (int)charTest << std::endl; 
    std::cout << std::hex << (int)buffer[0] << std::endl; 
} 

оболочка из:

ffffff89 
50 
4e 
47 
=== 
\211 
P 
N 
G 
=== 
ffffff89 
ffffff89 

файл в шестнадцатеричного ("прямой порядок байтов"):

0000000 5089 474e 0a0d 0a1a 0000 0d00 4849 5244 

мой вопрос: почему, появляется ffffff89, а не 89, и только на первом элементе char [] Я был с этим и не могу найти решение. Спасибо за прочтение.

это решение работает для меня:

std::cout << std::hex << ((unsigned int)(unsigned char)buffer[a]) 
      << std::endl; 
+0

Вы используете 'char', который, по-видимому, * подписан * в вашем компиляторе, и если установлен верхний бит (бит знака), то кастинг будет * расширять знак *. –

ответ

1

Поскольку ваши char s подписываются (старший бит установлен).

Прошу прощения, я не знаком с использованием std::hex, но вам почему-то нужно рассматривать его как значение без знака. Попробуйте лить char и беззнаковый тип.

+1

Кастинг в 'unsigned int' не должен ничего менять, если вы не нажмете' char' на 'unsigned char' в первую очередь. – chqrlie

+0

Использовать 'std :: cout << std :: hex << (unsigned int) (unsigned char) buffer [a] << std :: endl;' – chqrlie

+0

'std :: hex' - манипулятор ввода-вывода: сдвиг он в поток изменяет базу для целочисленного преобразования строки в 16. Поскольку это постоянный побочный эффект, всегда нужно сначала сменить 'std :: dec', чтобы преобразовать числа в десятичное представление на выходе. Существуют и другие подобные манипуляторы с той же проблемой. Предполагается, что это заменяет спецификации формата 'printf', но имеет гораздо худшие недостатки, заканчивающиеся где-то между * безнадежно сломанными * и * FUBAR *. – chqrlie

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