将字节数组转换为in_addr或in6_addr和endianness

时间:2011-02-08 19:30:36

标签: c++ c

当涉及到这个问题时,我很关心字节序。也许我在思考我不得不担心的事情。

我的代码输入是一个类似于:

的数据包

我收到了一个包含一些字节的网络数据包。如果我知道in_addr所在的字节数组中的索引(并且有有效数据),那么执行以下操作是否安全:

uint8_t* addrPtr = packet[IP_IDX];
struct in_addr addr;
memcpy((void*) addr, addrPtr, sizeof(in_addr));

无论Endianness如何,这都是安全的吗?

in6_addr实际上是16个字节呢?

感谢。

2 个答案:

答案 0 :(得分:4)

struct in_addr应该是网络字节顺序,IIRC。假设您的数据包也以网络字节顺序传送,那么您可以继续使用。

答案 1 :(得分:1)

如果你这样做:

uint8_t* addrPtr = packet + IP_IDX; // or &packet[IP_IDX]; whichever makes you happy
struct in_addr addr;
memcpy((void*) &addr, addrPtr, sizeof(in_addr));

你应该很好,memcpy对endianess没有任何作用,它只是复制字节,所以只要你不从数据包中拉出偏移量就不需要担心memcpy ...除非我不明白你的问题是什么。

如果你想处理IPv6,你可能需要单独的代码,因为偏移量和地址大小不同。

除了在两个地方伪造'地址'运算符之外,您的代码看起来还不错。