C中的大端算法

时间:2013-01-30 20:54:13

标签: c endianness

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

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

这似乎是直接的,但是冗长且容易出错。一定有更好的方法。

3 个答案:

答案 0 :(得分:4)

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

如果有必要,我可以发布一个代码示例,但我认为这是相当直接的。

答案 1 :(得分:1)

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

#include <arpa/inet.h>

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

并使用这些代替乱码代码。

答案 2 :(得分:0)

这个问题毫无意义。如果您写x = 0x12345678; x *= 2,则x的值为0x2468acf0。是否存储在第一个字节中带有f0或第一个字节中带有24的存储器中是完全不相关的。使用高级语言的关键在于它的工作原理并且您不关心0x12345678的存储方式。 (也就是说,编译器将文字0x2468acf0转换为框中的相应表示,您不必担心它。)