1. ホーム
  2. endianness

[解決済み] hton/ntohを使用するタイミングと、自分でデータ変換するタイミングは?

2022-02-08 05:02:19

質問

で、ビッグエンディアンの他機種からバイト配列を変換する場合、以下のようになります。

long long convert(unsigned char data[]) {
  long long res;
  res = 0;
  for( int i=0;i < DATA_SIZE; ++i)
    res = (res << 8) + data[i];
  return res;
}

他のマシンがリトルエンディアンであれば

long long convert(unsigned char data[]) {
  long long res;
  res = 0;
  for( int i=DATA_SIZE-1;i >=0 ; --i)
    res = (res << 8) + data[i];
  return res;
}

送信時はhton、受信時はntohでよいのでは?hton/ntonは整数を変換するもので、このconvert()はchar配列のためのものだからでしょうか?

どのように解決するのですか?

その hton / ntoh の間の変換を行う関数です。 ネットワーク順 ホストオーダー . もしこの2つが同じなら(つまりビッグエンディアンマシンなら)、これらの関数は何もしない。ですから、エンディアンを交換するために移植的に信頼することはできません。また、ご指摘の通り、これらの関数は16ビット( htons ) と32ビット ( htonl ) 整数で、コードでは最大で sizeof(long long) の方法に応じて DATA_SIZE が設定されています。