C 将数字转换为字节数组
嗨,我有一个基数为10的数字,例如3198,十六进制表示法是0x0C7E 假设我能得到的最大十六进制值是0xffffff,那么如何将该数字转换为十六进制,并将该十六进制值以[00][0C][7E]的格式放入字节数组中。也许这会起作用C 将数字转换为字节数组,c,C,嗨,我有一个基数为10的数字,例如3198,十六进制表示法是0x0C7E 假设我能得到的最大十六进制值是0xffffff,那么如何将该数字转换为十六进制,并将该十六进制值以[00][0C][7E]的格式放入字节数组中。也许这会起作用 uint32_t x = 0x0C7E; uint8_t bytes[3]; bytes[0] = (x >> 0) & 0xFF; bytes[1] = (x >> 8) & 0xFF; bytes[2] = (x &
uint32_t x = 0x0C7E;
uint8_t bytes[3];
bytes[0] = (x >> 0) & 0xFF;
bytes[1] = (x >> 8) & 0xFF;
bytes[2] = (x >> 16) & 0xFF;
/* Go back. */
x = (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0] << 0);
uint32\u t x=0x0C7E;
uint8_t字节[3];
字节[0]=(x>>0)&0xFF;
字节[1]=(x>>8)&0xFF;
字节[2]=(x>>16)&0xFF;
/*回去*/
x=(字节[2]数字已经是一个连续内存块-无需将其转换为另一个数组!只需使用指针算法获取单独的字节:
编辑:编辑为独立于端点
#define FAST_ABS(x) ((x ^ (x>>31)) - (x>>31))
int is_big_endian(void)
{
union {
uint32_t i;
char c[4];
} bint = {0x01020304};
return bint.c[0] == 1;
}
uint32_t num = 0xAABBCCDD;
uint32_t N = is_big_endian() * 3;
printf("first byte 0x%02X\n"
"second byte 0x%02X\n"
"third byte 0x%02X\n"
"fourth byte 0x%02X\n",
((unsigned char *) &num)[FAST_ABS(3 - N)],
((unsigned char *) &num)[FAST_ABS(2 - N)],
((unsigned char *) &num)[FAST_ABS(1 - N)],
((unsigned char *) &num)[FAST_ABS(0 - N)]
);
#包括
union uint32_值{
无符号整数值;
结构小端{
未签名字符fou;
无符号字符thi;
无符号字符集;
无符号字符fir;
}乐;
结构大端{
无符号字符fir;
无符号字符集;
无符号字符thi;
未签名字符fou;
}是;
};
内部主(空)
{
联盟uint32_值foo;
foo.value=3198;
printf(“%02x%02x%02x%02x%02x\n”,foo.le.fir,foo.le.sec,foo.le.thi,foo.le.fou);
返回0;
}
啊,很好!谢谢,对不起,我对C非常不了解。但是我如何将3198转换为十六进制?哦,另一个问题,如果我想将字节数组还原为十六进制格式,我该怎么做?@cnicutar我在你的回答中有一个问题。你的意思是字节[0]
作为MSB和字节[2]
作为LSB,对吗?你所说的“基数10”是什么样的C数据类型?C有整数类型,它们不区分3198和0x0C7E.Endianness-dependent。如果在SPARC或PPC系统(big-endian)上运行此操作,你得到的是相反的结果。请参见编辑。我已将其更改为endianness不变量。endianness检查的思想是从一个复杂的问题解决方案中提取出来的,如果你以可移植的方式编程,那么这个问题是不存在的。re-cnicutar的答案是。我给你一个+1表示破碎持久性;-)我完全同意:-)我只是想说明,在C语言中,一切都是位和字节,对编译器来说,只有对它们的解释才是真正重要的。这就是我最喜欢的C的主要功能{而其他人则讨厌它,并称它为C:-)中的“类型系统不存在”}
#include <stdio.h>
union uint32_value {
unsigned int value;
struct little_endian {
unsigned char fou;
unsigned char thi;
unsigned char sec;
unsigned char fir;
} le;
struct big_endian {
unsigned char fir;
unsigned char sec;
unsigned char thi;
unsigned char fou;
} be;
};
int main(void)
{
union uint32_value foo;
foo.value = 3198;
printf("%02x %02x %02x %02x\n", foo.le.fir, foo.le.sec, foo.le.thi, foo.le.fou);
return 0;
}