将int转换为C中的字节数组?

将int转换为C中的字节数组?,c,C,我需要将存储在int中的十进制数转换为字节数组(也称为存储在无符号字符数组中) 有什么线索吗?最简单的方法-使用sprintf(或snprintf,如果您有): 或者,如果希望以二进制形式存储: unsigned char a[sizeof( int ) ]; int n = 1234; memcpy( a, & n, sizeof( int ) ); 警告:未测试的代码 这应该是一个endianness不可知论的转变。它从低到高。也许有更有效的方法,但我现在想不起来 #include

我需要将存储在int中的十进制数转换为字节数组(也称为存储在无符号字符数组中)


有什么线索吗?

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

或者,如果希望以二进制形式存储:

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

警告:未测试的代码

这应该是一个endianness不可知论的转变。它从低到高。也许有更有效的方法,但我现在想不起来

#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;
}
#包括//CHAR\u位,UCHAR\u MAX
int num=68465;//在这里插入号码
无符号字符字节[sizeof(int)];
对于(int i=0;i>=CHAR\u位;
}

我之所以发布这篇文章,主要是因为我在这里没有看到另一个结果不会因处理器的端度而改变的解决方案。

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

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

我把问题理解为将数字转换为字符串表示(正如Neil所做的那样)

下面是一个不使用任何lib的简单方法

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;}
inti=0;
int j=0;
do{a[i++]='0'+n%10;n/=10;}while(n);
a[i--]=0;
对于(j而言,这可能有效

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]);
}
int n=1234;
常数int arraylelength=sizeof(int);
无符号字符*bytePtr=(无符号字符*)&n;

对于(int i=0;i警告:
memcpy
如果不考虑endianness,可能会产生不可预测的行为。@Zarel结果完全可以预测,但可能不需要。“不可预测”从某种意义上说,除非你知道运行它的处理器的endianness,否则你无法预测结果。@Zarel:如果你关心endianness,只需在memcpy()之前调用int上的hton(),就可以得到一个固定的顺序(网络顺序)。memcpy保留endianness;如果你想将数据转换回(int*),您可以并且将得到正确的结果。如果您在复制数据时“更正”了尾数,那么您需要在访问内存之前再次“反转”它,就像它将在机器的尾数中包含一个int一样(这正是它发生的情况:在内存中,a和by&n所指的数据之间没有区别,它只更改了“C”认为是),但用户可能希望更改它们,以保持与原始int中相同的字节顺序。此外,您的数组大小和循环控制计算是错误的。
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]);
}