在C语言中将字节转换为ASCII

3

有人能建议一下如何在C语言中将字节数组转换为ASCII码吗?或者将字节数组转换为十六进制,然后再转换为ASCII码?

[04/02][编辑]: 重新表述一下,我希望将字节转换为十六进制并将转换后的十六进制值存储在数据结构中。应该怎么做呢?

祝好, darkie


4
一个ASCII编码的字符串就是一个字节数组,所以你的问题没有太多意义。 - Mark Byers
2
我之前认为在 C 语言中 byte array 是 ASCII 字符串,能否给出你想要的输入和输出的例子? - Andy Mortimer
1
挑剔的人:一个字符串一个字节数组,而一个字节数组可以被解释为字符串。 - Felix Kling
1
只需将0添加到数组中,就可以得到字符串。 - Janusz Lenar
1
@Nick D:我想指出的是,字节数组不一定是字符串。特别是对于 < 0> 127 的值。它可以只是一个字节数组,就像有整数数组等一样。这是对Andy评论的补充。字节数组不是字符串,但可以被解释为字符串,这是一个区别。 - Felix Kling
显示剩余6条评论
3个回答

3

如果在C语言中将整数解释为char,只要它在范围内,就会得到相应的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,这是必须的,以正确终止字符串。您可以像使用其他C字符串一样使用bytes,从中复制,将其附加到其他字符串,遍历它,打印它等等。

@Felix:没错,但这样做就没有太多意义了,因为你得到的是int的模256,这不太可能是程序员的期望。 - Eli Bendersky
2
吹毛求疵:在 C 语言中,'a' 可能是 97,也可能不是。在今天的大多数计算机上,它是 97,但 C 标准并不保证这一点。为了实现可移植性,必须制作一个查找表。当然,在今天的大多数系统上,'a' == 97 是正确的。 - Alok Singhal
嗨,我的意思是如何将字节转换为ASCII并存储这些值,也许在一个数组中? - name_masked
@darkie15:我不明白你的意思。能否详细说明一下(或者在问题中加入一个例子)? - Eli Bendersky
好的... 现在可以通过使用%x格式来实现十六进制形式。但这只适用于打印... 我想将该十六进制形式存储起来,比如在一个数组中... 这样我就可以以后用于更多的处理。 - name_masked
显示剩余2条评论

1

首先,你应该更加注意你的问题陈述。很难说出你真正想听到什么。我想你有一些二进制数据块,并希望将其转换为人类可读的形式,例如在屏幕上进行调试转储(我知道我可能在这里误解了你)。

你可以使用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++;
    }
}

0

在C语言中,字符和整数都是以二进制形式存储的。当在ASCII范围内工作时,它们通常可以互换使用。

int i = 0x61;
char x = i;

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

这应该会在屏幕上打印出 'a'。


你是想说字符就是整数吗? - Felix Kling
实际上不是这样的,它们并不相同。它们通常大小不同(字节与字), 但您可以将字符视为整数,反之亦然。 - zellio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接