Портативный способ печати значений hexa с помощью sprintf

У меня были некоторые проблемы с преобразованиями 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 нужен, а также побитовое И в байте для преобразования …

Итак, поскольку я не очень хорошо понимал, что такое расширение знака, вы можете сказать мне, по крайней мере, будет ли фрагмент кода, который я написал, работать на всех системах?

2

Решение

поскольку printf не безопасен для типов, он ожидает для каждого спецификатора форматирования аргумент специального размера.
то, что вы должны привести свой характер аргумент unsigned int если вы используете какой-либо символ форматирования, который ожидает тип int-size.

"%x" спецификатор требует беззнакового целого.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]