将数字转换为字节数组

3

你好,我有一个十进制数例如3198,它的十六进制表示为0x0C7E。

如何将该数字转换为十六进制,并将该十六进制值以[00] [0C] [7E]格式放入字节数组中,假设我能拥有的最大十六进制值是0xffffff。


你所说的“十进制数”在C语言中指的是哪种数据类型?C语言有整型数据类型,它们不区分3198和0x0C7E。 - Klas Lindbäck
3个回答

9
也许这样做会起作用吗?
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);

啊,好的!谢谢。抱歉我对C语言很菜。但是我怎么把3198转换成十六进制呢? - kkh
哦,另一个问题,如果我想将字节数组还原为十六进制格式,我该怎么做? - kkh
@cnicutar,我在你的回答中有一个问题。你是说bytes[0]是MSB,bytes[2]是LSB对吗? - user8026974

1

数字已经是连续的内存块-不需要将它转换为另一个数组!只需通过使用指针算术来提取单独的字节:

编辑:修改为与字节序无关

#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)]
       );

端序相关。如果您在 SPARC 或 PPC 系统(大端序)上运行此代码,则会得到相反的结果。 - FrankH.
我已将其更改为具有端粒不变性。字节序检查的想法来自于此处 - Agnius Vasiliauskas
如果你一开始就以可移植的方式进行编程,那么一个不存在的问题就变成了一个复杂的解决方案,重新组织cnicutar的答案。我因为你的机智和坚持给你加了一个+1点赞。 - FrankH.
我完全同意 :-) 我只是想展示在 C 中 - 一切都是位和字节 - 只有对它们的解释才是编译器真正关心的。这就是 C 的主要优势,也是我最喜欢的地方 {而其他人却讨厌它并称其为 "C 中类型系统不存在" :-) }。 - Agnius Vasiliauskas

0
#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;
}

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