У меня были некоторые проблемы с преобразованием двоичного кода в (печатаемый) шестнадцатеричный. Я нашел функциональный (для своей системы) способ написания кода, но мне нужно знать, переносим ли он на все системы (ОС и оборудование).
Итак, это моя функция (попытка построить UUID из фрагмента двоичного текста):
int extractInfo( unsigned char * text )
{
char h[3];
int i;
this->str.append( "urn:uuid:" );
for( i = 56; i < 72; i++ )
{
ret = snprintf( h, 3, "%02x", text[i] );
if( ret != 2 )
return 1;
this->str.append( h );
if( i == 59 || i == 61 || i == 63 || i == 65 )
this->str.append( "-" );
}
return 0;
}
Я понял, что из-за знакового расширения мои значения плохо печатаются, если я использую char вместо unsigned char (С++ считывает двоичный файл и преобразует в шестнадцатеричный). Принято и изменено соответственно.
Но я встречал и другие варианты этого: преобразование из двоичного hex в C, и я действительно потерялся. В фрагменте кода раскрутки:
sprintf(hex, "%02x", (unsigned int) buffer[0] & 0xff);
Я не понял, почему, хотя массив представляет собой unsigned char (как определено в исходном опубликованном коде тем, кто задал вопрос), необходимо приведение к unsigned int, а также < strong>побитовое И для байта, который нужно преобразовать...
Итак, поскольку я не очень хорошо понял, что такое расширение знака, можете ли вы сказать мне, по крайней мере, будет ли написанный мной фрагмент кода работать на всех системах?
snprintf()
? Любой код C++ для вывода ваших материалов с использованиемstd::ostream
будет переносимым без проблем. - person πάντα ῥεῖ   schedule 20.03.2014unsigned char
будет повышен доint
(если толькоsizeof(char) == sizeof(int)
...), а не доunsigned int
, а спецификатор формата%x
говорит, что ему нуженunsigned int
. - person Simple   schedule 20.03.2014snprintf( h, 3, "%02hhx", text[i] );
- person Johnny Mopp   schedule 20.03.2014buffer
определяется какunsigned char buffer[N]
, то ни приведение, ни побитовое И с 0xff не нужны. Еслиbuffer
определяется какchar buffer[N]
, вам нужно привести кunsigned char
или вам нужно выполнить побитовое И с 0xff; если вы делаете оба, это перебор. - person Jabberwocky   schedule 20.03.2014