【问题标题】:Converting number to byte array将数字转换为字节数组
【发布时间】:2011-12-02 07:46:55
【问题描述】:

您好,我有一个基数为 10 的数字,例如 3198,十六进制表示为 0x0C7E

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

【问题讨论】:

  • 你所说的“base 10 number”是什么C数据类型? C 有整数类型,它们不区分 3198 和 0x0C7E。

标签: c


【解决方案1】:

也许这会起作用?

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 转换为十六进制?
  • 哦,另一个问题,如果我想将字节数组恢复为十六进制格式,我该怎么做?
  • @cnicutar 我在你的回答中有一个问题。你的意思是 bytes[0] 作为 MSB 和 bytes[2] 作为 LSB 对吧?
【解决方案2】:

数字已经是一个连续的内存块 - 无需将其转换为 ANOTHER 数组!只需使用指针算法获取单独的字节:

编辑:编辑为独立于字节序的

#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 系统(big-endian)上运行它,你会得到相反的结果。
  • 查看编辑。我已将其更改为字节顺序不变。字节序检查思路取自here
  • 一个复杂的解决方案,如果您以可移植的方式开始编程则不存在的问题,re - cnicutar 的答案。我给你一个 +1 的精明坚持;-)
  • 我完全同意 :-) 我只是想表明,在 C 中——一切都是位和字节——只有对它们的解释才是编译器真正重要的。这是我最喜欢的 C 的主要力量{而其他人讨厌它并称其为 C 中“不存在类型系统”:-) }
【解决方案3】:
#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;
}

【讨论】:

    猜你喜欢
    • 2014-08-08
    • 2019-11-24
    • 1970-01-01
    • 2011-07-02
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多