1

有没有一种方便的方法对大端数据进行算术运算?这是我一直在做的事情(在伪代码中):

main:
    unsigned int big_endian_number = 0x12345678;
    int multiplier = 7;

    unsigned int little_endian_number = reverse_the_bytes(big_endian_number);
    little_endian_number = little_endian_number * multiplier;

    big_endian_number = reverse_the_bytes(little_endian_number);

这看起来很直接,但冗长且容易出错。一定有更好的方法。

4

3 回答 3

4

网络字节顺序是大端,使用 ntohl(网络到主机)将转换为本地字节序,然后使用 htonl 转换回来。

如有必要,我可以发布一个代码示例,但我认为这相当简单。

于 2013-01-30T21:25:55.273 回答
1

就个人而言,我会在标头中定义一些函数来执行您需要的算术运算:

#include <arpa/inet.h>

static inline uint32_t BEAdd_u32(uint32_t x, uint32_t y) {
    return htonl(ntohl(x) + ntohl(y));
}

并使用它们而不是在转换中乱扔代码。

于 2013-01-30T21:15:02.950 回答
0

这个问题没有意义。如果你写x = 0x12345678; x *= 2,那么 x 将有值0x2468acf0f0是在第一个字节中还是在第一个字节中存储在内存24中是完全无关的。使用高级语言的全部意义在于它可以工作,并且您不在乎如何0x12345678存储。(也就是说,编译器将文字0x2468acf0转换为盒子上的适当表示,您不必担心。)

于 2013-01-30T21:15:32.123 回答