У меня были некоторые проблемы с преобразованиями hexa в двоичные файлы (для печати). Я достиг функционального (для моей системы) способа написания кода, но Мне нужно знать, если это портативный на всех системах (ОС & аппаратное обеспечение).
Так что это моя функция (попытка построить 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;
}
Я понял, что из-за расширение знака мои значения не печатаются хорошо, если я использую голец вместо символ без знака (C ++ читать двоичный файл и конвертировать в шестнадцатеричный). Принимаются и изменяются соответственно.
Но я встречал больше вариантов сделать это: Преобразование из двоичного файла в шестнадцатеричный в C, и я действительно потерян В раскручивать кусок кода:
sprintf(hex, "%02x", (unsigned int) buffer[0] & 0xff);
Я не понял, почему, хотя массив является беззнаковым символом (как определено в исходном опубликованном коде тем, кто задал вопрос), приведение к без знака int нужен, а также побитовое И в байте для преобразования …
Итак, поскольку я не очень хорошо понимал, что такое расширение знака, вы можете сказать мне, по крайней мере, будет ли фрагмент кода, который я написал, работать на всех системах?
поскольку printf не безопасен для типов, он ожидает для каждого спецификатора форматирования аргумент специального размера.
то, что вы должны привести свой характер аргумент unsigned int
если вы используете какой-либо символ форматирования, который ожидает тип int-size.
"%x"
спецификатор требует беззнакового целого.
Других решений пока нет …