有没有一种方便的方法来对大端数据进行算术运算?这是我一直在做的(伪代码):
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);
这似乎是直接的,但是冗长且容易出错。一定有更好的方法。
答案 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
转换为框中的相应表示,您不必担心它。)