【发布时间】:2013-10-17 01:02:58
【问题描述】:
我只是想问一下我从小端转换为大端的方法是否正确,只是为了确定我是否理解其中的区别。
我有一个以 little-endian 存储的数字,这里是数字的二进制和十六进制表示:
0001 0010 0011 0100 0101 0110 0111 1000
12345678
在大端格式中,我认为应该交换字节,如下所示:
1000 0111 0110 0101 0100 0011 0010 0001
87654321
这是正确的吗?
此外,下面的代码尝试执行此操作但失败了。有什么明显的错误或者我可以优化一些东西吗?如果代码不适合这种转换,您能否解释一下原因并展示执行相同转换的更好方法?
uint32_t num = 0x12345678;
uint32_t b0,b1,b2,b3,b4,b5,b6,b7;
uint32_t res = 0;
b0 = (num & 0xf) << 28;
b1 = (num & 0xf0) << 24;
b2 = (num & 0xf00) << 20;
b3 = (num & 0xf000) << 16;
b4 = (num & 0xf0000) << 12;
b5 = (num & 0xf00000) << 8;
b6 = (num & 0xf000000) << 4;
b7 = (num & 0xf0000000) << 4;
res = b0 + b1 + b2 + b3 + b4 + b5 + b6 + b7;
printf("%d\n", res);
【问题讨论】:
-
您可以使用更好的位模式示例,例如“0001 0010 0011 0100 0101 0110 0111 1000”
-
您的代码是基于半字节的(4 位)而不是基于字节的(8 位)。它采用 32 位值并颠倒半字节的顺序。我认为您希望基于字节完成 64 位值。此外,由于它们是移动的,而不是轮换的,因此这些班次将不起作用。因此,您将“从头到尾”丢失位。为了稍微整理一下,考虑使用数组而不是离散的
b1、b2等。 -
我这样做是基于以下任务:“一个由十六进制表示 (st uv wx yz) 表示的 32 位数值应记录在一个四字节字段中为 (st uv wx yz) 。”因此,如果我也这样做,而是采用 8 位(1 字节),它会起作用吗?
-
您的示例是 64 位的。所以你真的是指 32 位?
标签: c endianness