コンピュータの発展史において、データを保存する方法に統一された基準はありませんでした。
バイトの配置には、主に2つの一般的な規則があります。例えば、多桁数の下位を小さいアドレスに、上位を大きいアドレスに配置する場合をリトルエンディアンと呼び、その逆をビッグエンディアンと呼びます。ネットワークアプリケーションでは、異なるマシンタイプが異なる標準のエンディアンを採用する可能性があるため、バイトオーダーは考慮すべき要素であり、通常はネットワーク標準に変換されます。
読書習慣では、ビッグエンディアンの方が左から右への読み順に合致しやすい。
申し訳ありませんが、翻訳する中国語のテキストが提供されていません。テキストを提供していただければ、日本語に翻訳します。
- x86、MOS Technology 6502、Z80、VAX、PDP-11 などのプロセッサはリトルエンディアンです。
- モトローラ6800、モトローラ68000、PowerPC 970などのプロセッサは大Endianです。
- ARM、PowerPC(PowerPC 970を除く)、DEC Alpha、SPARC V9、MIPS、PA-RISCおよびIA64のバイトオーダーは構成可能です。
ネットまえがき
ネットワーク転送では通常、ビッグエンディアンが採用され、ネットワークバイトオーダーまたはネットワーク順とも呼ばれます。IPプロトコルでは、ビッグエンディアンをネットワークバイトオーダーとして定義しています。 ソケットは、16ビットおよび32ビット整数のネットワークバイトオーダーとローカルバイトオーダー間の変換を行うための関数群を定義します。
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); //把uint32_t类型从主机序转换到网络序
uint16_t htons(uint16_t hostshort); //把uint16_t类型从主机序转换到网络序
uint32_t ntohl(uint32_t netlong); //把uint32_t类型从网络序转换到主机序
uint16_t ntohs(uint16_t netshort); //把uint16_t类型从网络序转换到主机序
もし__INLINE_CODE_0__をネットワークライブラリとして選択した場合、組み込みのネームスペースにはクロスプラットフォーム対応の関数名が存在します。
- boost::asio::detail::socket_ops::network_to_host_long
- boost::asio::detail::socket_ops::network_to_host_short
- boost::asio::detail::socket_ops::host_to_network_long
- boost::asio::detail::socket_ops::host_to_network_short
ビジュアルスタジオ デバッガー
デバッグモードで、デバッグメニューのウィンドウを選択し、メモリウィンドウにチェックを入れます。
__INLINE_CODE_0__において、デバッガー内でメモリ内のデータを確認できます。図を参照してください。
メモリの確認方法
- 変数名を直接出力し、対応する変数のアドレスにジャンプします。
- 変数そのものがポインタであれば、変数をダブルクリックして選択し、メモリウィンドウにドラッグすると、対応するアドレスの内容が表示されます。
- 変数がポインタでない場合、計算ウィンドウに追加し、アドレスを取得後、手動でメモリウィンドウにコピーする。
例えば
データを受信し、buffer
对象中,将网络序转成主机序,得到__INLINE_CODE_1__に保存します。この値は30で、サーバー側ではこのデータを送信するために4バイトが割り当てられています。
bool NetworkMessage::decode_header()
{
// 网络序转成主机序
body_length_ = boost::asio::detail::socket_ops::network_to_host_long(*(int *)buffer_.data());
return auto_reserve(body_length_);
}
メモリウィンドウで、INLINE_CODE_0 の内容を観察してください。
メモリウィンドウで、INLINE_CODE_0 の内容を観察してください。