3

質問

バイナリをその整数表現に変換する最良の方法は何ですか?

コンテクスト

ソケット接続やバイナリファイルなどの外部ソースから取得したバイナリデータを含むバッファがあると想像してみてください。データは明確に定義された形式で編成されており、最初の4つのオクテットは単一の符号なし32ビット整数(後続のデータのサイズになる可能性があります)を表すことがわかっています。それらのオクテットを使用可能な形式(std :: uint32_tなど)に変換するためのより効率的な方法は何でしょうか?

これが私がこれまでに試したことです:

#include <algorithm>
#include <array>
#include <cstdint>
#include <cstring>
#include <iostream>

int main()
{
    std::array<char, 4> buffer = { 0x01, 0x02, 0x03, 0x04 };
    std::uint32_t n = 0;

    n |= static_cast<std::uint32_t>(buffer[0]);
    n |= static_cast<std::uint32_t>(buffer[1]) << 8;
    n |= static_cast<std::uint32_t>(buffer[2]) << 16;
    n |= static_cast<std::uint32_t>(buffer[3]) << 24;
    std::cout << "Bit shifting:  " << n << "\n";

    n = 0;
    std::memcpy(&n, buffer.data(), buffer.size());
    std::cout << "std::memcpy(): " << n << "\n";

    n = 0;
    std::copy(buffer.begin(), buffer.end(), reinterpret_cast<char*>(&n));
    std::cout << "std::copy():   " << n << "\n";
}

私のシステムでは、次のプログラムの結果は次のとおりです。

Bit shifting:  67305985
std::memcpy(): 67305985
std::copy():   67305985
  1. それらはすべて標準に準拠していますか、それとも実装で定義された動作を使用していますか?
  2. どちらがより効率的ですか?
  3. その変換を行うための賭けの方法はありますか?
4

1 に答える 1

3

あなたは本質的にエンディアンについて尋ねています。プログラムはあるコンピューターでは動作するかもしれませんが、別のコンピューターでは動作しないかもしれません。「明確に定義された形式」がネットワーク順序である場合、ネットワーク順序と特定のマシンの自然順序との間で変換するマクロ/関数の標準セットがあります。

于 2012-04-21T18:08:16.890 に答える