Как сохранить шестнадцатеричные значения ASCII в массив (буфер) в C? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть значение int на входе, и я хочу сохранить его в буфере / массиве в виде шестнадцатеричного представления ASCII.Я знаю, как напечатать его в шестнадцатеричном виде, но как я могу сохранить его в буфере?

Вот код, который я написал:

int a = 98765;
char buffer[20];
m = sprintf(buffer, "%d", a);

printf("ASCII value in hex: ");
for(int i=0; buffer[i]!='\0'; i++)
{
    printf("%02X", buffer[i]);
}

, например, если a = 123, я хочучтобы получить 313233

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Вы уже использовали sprintf для представления десятичных значений в виде строки;Вы можете сделать то же самое для шестнадцатеричного форматирования.

Используйте возвращаемое значение sprintf() (которое является количеством напечатанных символов), чтобы переместить индекс в буфер в качестве места назначения для следующей пары шестнадцатеричных цифр, а затем выполнить итерацию каждого символа в десятичной дроби.buffer.

Обратите внимание, что вы можете использовать возвращаемое значение (m) из первого sprintf() для итерации, а не для проверки на nul.

char hexbuffer[64];
int index = 0 ;
for(int i = 0; i < m; i++)
{
    index += sprintf( &hexbuffer[index], "%02X", buffer[i] ) ;
}

Конечно, если ввод содержит только десятичные цифры (т. Е. Пользователь не вводит отрицательное значение, вызывающее - в buffer[0], вы можете просто вставить 3 перед каждым десятичным знакомцифра, таким образом:

char hexbuffer[64];
for(int i = 0; i < m; i++)
{
    bexbuffer[i * 2] = '3' ;
    hexbuffer[i * 2 + 1] = buffer[i] 
}

Если предназначались только десятичные цифры, вам следует изменить тип a на unsigned и использовать спецификатор формата %u для десятичного ввода.

0 голосов
/ 23 октября 2018

Первый sprintf дал вам массив символов, где каждый из них находится в диапазоне от 0x30 до 0x39.Вы хотите, чтобы они были расширены до двух символов «3» и «0», «3» и «1» и т. Д.

Вы расширяете каждый символ в источнике до двух символов в выводе,Это означает, что вы не можете использовать тот же буфер назначения, что и исходный буфер - вы перезапишете значения в исходном буфере до того, как обработаете их.Возможно, вы захотите сделать первый sprintf в отдельном массиве char, если вам нужен результат в buffer.В вашем цикле измените printf на sprintf на индекс в buffer, увеличивая ваш индекс на два в каждом цикле.(В два раза, потому что таким образом вы перезапишете терминатор строки первой итерации с выводом sprintf второй итерации, который будет включать новый терминатор строки. sprintf в последней итерации цикла завершит строку для вас.)

Вы не упомянули самый длинный ввод, который вы должны обрабатывать, или почему вы выбрали длины массива, которые вы сделали.Здесь существует опасность переполнения буфера, если вы принимаете входные данные, которые слишком длинны для ваших буферов (и не забудьте учесть пространство для нулевого завершения после последнего символа.)

...