C 将数字转换为字节数组

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 &

嗨,我有一个基数为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 >> 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;
}