0

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 ;

srcIPaxxx.yyy.zzz.tttと thesrcPortをリトルエンディアンに変換するにはどうすればよいuint16_tですか?

4

2 に答える 2

1

すでに関数があります:

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

でプロトタイプ化されている

#include <arpa/inet.h>

あなたの質問を正しく理解できれば、これらの関数はあなたが望むことを実行します。

于 2015-11-03T18:53:22.437 に答える
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;
} 
于 2015-11-03T03:25:20.520 に答える