将openvswitch类型转换为little endian

时间:2015-11-03 03:12:19

标签: c endianness openvswitch

在Open vSwitch 2.4.0实现中,我们有以下内容:

#ifdef __CHECKER__
#define OVS_BITWISE __attribute__((bitwise))
#define OVS_FORCE __attribute__((force))
#else
#define OVS_BITWISE
#define OVS_FORCE
#endif

/* The ovs_be<N> types indicate that an object is in big-endian, not
 * native-endian, byte order.  They are otherwise equivalent to uint<N>_t. */

typedef uint16_t OVS_BITWISE ovs_be16;
typedef struct {
    ovs_be16 hi, lo;
} ovs_16aligned_be32;

我有以下变量:

ovs_16aligned_be32 srcIP;
ovs_be16 srcPort ;

如何将srcIP转换为xxx.yyy.zzz.ttt,将srcPort转换为小端uint16_t

2 个答案:

答案 0 :(得分:1)

已有功能:

htonl()
htons()
ntohl()
ntohs()

中的原型
#include <arpa/inet.h>

如果我理解你的问题,这些功能会做你想要的。

答案 1 :(得分:0)

好的,我不知道什么是openvswitch,但我认为这应该有效:

ovs_16aligned_be32 ovs_16aligned_be32_to_littleEndian(ovs_16aligned_be32 a) {
    ovs_16aligned_be32 b.high = ovs_be16_toLittleEndian(a.low);
    b.low = ovs_be16_toLittleEndian(a.high);
    return b;
}

ovs_be16 ovs_be16_toLittleEndian(ovs_be16 srcPort a) {
   ovs_be16 srcPort b = (a >> 8) & 0x00ff;
   b |= a << 8;

   return b;
}