2010-04-02 2 views
2

Может ли кто-нибудь предложить средства преобразования байтового массива в ASCII в C? Или преобразование байтового массива в шестнадцатеричное, а затем в ASCII?Преобразование из байта в ASCII в C

[04/02] [Edited]: Чтобы перефразировать его, я хочу преобразовать байты в шестнадцатеричный и сохранить преобразованные шестнадцатеричные значения в структуре данных. Как это сделать?

С уважением, Смуглянка

+4

Строка, кодированная в ASCII **, представляет собой ** массив байтов, поэтому ваш вопрос не имеет большого смысла. –

+2

Я думал, что байтовый массив/был/строкой ASCII, в C. Не могли бы вы привести примеры ввода и вывода, которые вы хотите? –

+1

Nitpicky: Строка ** является ** байтовым массивом, а байт-массив ** может ** интерпретироваться как строка. –

ответ

1

Прежде всего, вы должны больше заботиться о формулировке своих вопросов. Трудно сказать, что вы действительно хотите услышать. Я думаю, что у вас есть двоичный blob и хотите, чтобы он был в форме, удобной для человека, например. выгрузить его на экран для отладки. (Я знаю, что я, вероятно, неправильно интерпретирую вас здесь).

Например, вы можете использовать snprintf(buf, sizeof(buf), "%.2x", byte_array[i]), чтобы преобразовать один байт в шестнадцатеричное представление ASCII. Ниже приведена функция сброса всей области памяти на экран:


void 
hexdump(const void *data, int size) 
{ 
    const unsigned char *byte = data; 

    while (size > 0) 
    { 
     size--; 
     printf("%.2x ", *byte); 
     byte++; 
    } 
} 
3

Ну, если вы интерпретируете целое как char в C, вы получите, что ASCII-символ, пока он находится в диапазоне.

int i = 97; 
char c = i; 

printf("The character of %d is %c\n", i, c); 

Печать:

The character of 97 is a 

Обратите внимание, что никакой проверки ошибок не делается - я предполагаю, что 0 <= i < 128 (диапазон ASCII).

В противном случае, массив байтовых значений может быть непосредственно интерпретирован как ASCII строка:

char bytes[] = {97, 98, 99, 100, 101, 0}; 

printf("The string: %s\n", bytes); 

распечатки:

The string: abcde 

Примечания последних байт: 0, это необходимо, чтобы завершить строку правильно , Вы можете использовать bytes как и любую другую строку C, скопировать ее, добавить в другие строки, переместить ее, распечатать и т. Д.

+0

Целое число не должно быть '0 <= i <128' или (' 32 <= i <128' для печатных символов). Если вы конвертируете целое число в символ, целое число усекается на 8 младших бит (младшие значащие разряды). Только те, кто должен быть в этом диапазоне. Например. 'i = 1121' дает тот же результат, что и' i = 97' ('1121 = 1024 + 97') –

+0

@Felix: true, но тогда это не имеет большого смысла, поскольку вы получаете по модулю 256' int' , что вряд ли будет желанием программиста. –

+2

Nitpick: '' a'' может быть или не быть 97 в C. На большинстве компьютеров сегодня это так, но стандарт C не гарантирует этого. Чтобы сделать это переносимо, нужно создать таблицу поиска. Конечно, '' a '== 97' верен для большинства систем сегодня. –

0

Char.s и Int.s хранятся в двоичном формате на C. И обычно это может быть используются друг на друге при работе в диапазоне ASCII.

int i = 0x61; 
char x = i; 

fprintf(stdout, "%c", x); 

, который должен печатать 'a' на экране.

+0

Вы хотите сказать, что символы целые? –

+0

На самом деле нет, я не знаю, потому что это неправильно, они нет. Они, как правило, разного размера (byte versus word), однако вы можете рассматривать символы так, как если бы они были целыми числами и наоборот. – zellio

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