0

uint8_t * ポインターの形式で受信した着信フレームを解析する必要があるコードに取り組んでいます。

フレームから MAC アドレスを取得し、簡単に計算できるように uint64_t 値に変換するユーティリティ メソッドを作成しました。

uint64_t addr = uint64_t(_frm_ptr[0]) << 40 | uint64_t(_frm_ptr[1]) << 32 | 
                       uint64_t(_frm_ptr[2]) << 24 | uint64_t(_frm_ptr[3]) << 16 | 
                       uint64_t(_frm_ptr[4]) << 8 | uint64_t(_frm_ptr[5]);

ソース MAC アドレスがビッグ エンディアン形式で「b8:ac:6f:c0:3d:25」の場合、同じ順序で送信されますか?

MACアドレスはネットワーク上でどのように送信されますか?

上記のコード スニペットはすべてのプラットフォームで機能しますか?

4

4 に答える 4

5

ネットワーク バイト オーダーはビッグ エンディアンであるため、アドレスがビッグ エンディアン形式の場合は、そのように送受信されます。バイト スワップは必要ありません。

于 2013-07-01T07:02:48.007 に答える
4

フレーム内のバイトは、ホストコンピューターのエンディアンに関係なく、固定された順序 (@Caleb が指摘するビッグエンディアン) です。

バイトを 1 つずつコピーしているので、これは常に機能します。memcpyフレーム データからshort, int, ...へのマルチバイト割り当てまたは 's を使用する場合にのみ問題がありntohs()ます

于 2013-07-01T07:04:28.717 に答える
2

標準フォーマットとも呼ばれる MAC アドレスの標準表記は、最下位ビットが最初に送信される送信ビット順に記述されます。

IEEE 802.3 (イーサネット) および IEEE 802.4 (トークン バス) は、バイト (オクテット) を左から右へ、各バイトの最下位ビットを最初に送信しますが、IEEE 802.5 (トークン リング) および IEEE 802.6 はバイトを送信します。最上位ビットが最初のネットワーク経由

標準形式の 12-34-56-78-9A-BC のアドレスは、標準の送信順序 (最下位ビットが最初) でビット 10000100 00101100 01101010 00011110 01011001 00111101 としてネットワーク経由で送信されます。

ただし、トークン リング ネットワークの場合、ビット 00010010 00110100 01010110 01111000 10011010 10111100 として、最上位ビットが最初の順序で送信されます。後者は、48-2C-6A-1E-59-3D と誤って表示される場合があります。これは、ビット反転順序、非標準形式、MSB 形式、IBM 形式、またはトークン リング形式と呼ばれます。標準形式は一般に好まれ、最新のすべての実装で使用されます。

于 2013-07-01T07:06:40.820 に答える
0

MAC アドレスと同様に、openflow/sdn のような他の多くのケースで使用される 64 ビットの数値があります。64ビットの数値であることが望ましい場合は、次のことを試してください。

union {
   char charId[8];
   uint64_t numId;
} dpId;
char *save_ptr=0;
uint8_t i = 0;
char* dpid_str = "C0:0C:C1:1C:C2:2C:01:00";
char* token = strtok_r(dpid_str, ":", &save_ptr);
while(token != NULL && i < 8){
    dpId.charId[i++] = std::stoi(token,0,16);
    token = strtok_r(NULL,":",&save_ptr);
}
dpId.numId = ntohll(dpId.numId);
于 2014-04-11T17:15:58.137 に答える