在C语言中将整型转换为字节数组?

9
我需要将存储在int中的十进制数转换为字节数组(也称存储在无符号字符数组中)。
有什么线索吗?
5个回答

12

或者如果你知道自己在做什么:

int n = 12345;
char* a = (char*)&n;

1

最简单的方法 - 使用sprintf(如果有snprintf,则使用它):

unsigned char a[SOMESIZE]
int n = 1234;
sprintf( a, "%d", n );

或者如果你想将它存储为二进制:

unsigned char a[sizeof( int ) ];
int n = 1234;
memcpy( a, & n, sizeof( int ) );

2
警告:如果您没有考虑字节序,memcpy 可能会产生不可预测的行为。 - Zarel
4
@Zarel 的结论将是完全可预测的,但也许是不希望的。 - anon
“Unpredictable”在这里的意思是,除非你知道处理器的字节序,否则你无法预测结果。 - Zarel
@Zarel:如果你关心字节序,只需在memcpy()之前调用hton()函数,即可获得固定的顺序(网络字节序)。 - kriss
memcpy 保留了字节序;如果你想通过将 a 强制转换为 (int *) 来访问数据,你可以并且会得到正确的结果。如果在复制数据时“纠正”了字节序,那么在访问内存时就需要再次“反转”它,就好像它包含了机器字节序中的 int 一样(这正是发生的事情:在内存中,a 和 &n 指向的数据没有区别,只有“C”认为它们不同)。 - ShinTakezou

1

这可能可行

int n=1234;    
const int arrayLength=sizeof(int);
unsigned char *bytePtr=(unsigned char*)&n;

for(int i=0;i<arrayLength;i++)
{
   printf("[%X]",bytePtr[i]);
}

注意处理与字节序有关的顺序问题


0

警告:未经测试的代码。

这应该是一种与字节序无关的转换。它从低到高进行。可能有更有效的方法来完成它,但我暂时想不到。

#include <limits.h> // CHAR_BIT, UCHAR_MAX

int num = 68465; // insert number here
unsigned char bytes[sizeof(int)];
for (int i=0; i<sizeof(int); i++)
{
    bytes[i] = num & UCHAR_MAX;
    num >>= CHAR_BIT;
}

我发布这篇文章主要是因为我在此看不到其他解决方案,而这些解决方案不会因为您的处理器的字节顺序而改变结果。

但是也许用户希望它们更改-保持与原始整数相同的字节顺序。另外,您的数组大小和循环控制计算是错误的。 - anon

0

我理解这个问题是将数字转换为字符串表示形式(就像Neil所做的那样)。

以下是一种简单的方法,可以在不使用任何库的情况下完成它。

int i = 0;
int j = 0;
do {a[i++] = '0'+n%10; n/=10;} while (n);
a[i--] = 0;
for (j<i; j++,i--) {int tmp = a[i]; a[i] = a[j]; a[j] = tmp;}

这个问题可能需要一些澄清,因为其他人显然理解你想要使用 int 的内部表示中使用的底层字节(但如果你想做这种事情,最好使用在中定义的某些固定大小类型而不是 int,否则你将无法确定你的字节数组的长度)。


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