質問
バイナリをその整数表現に変換する最良の方法は何ですか?
コンテクスト
ソケット接続やバイナリファイルなどの外部ソースから取得したバイナリデータを含むバッファがあると想像してみてください。データは明確に定義された形式で編成されており、最初の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
- それらはすべて標準に準拠していますか、それとも実装で定義された動作を使用していますか?
- どちらがより効率的ですか?
- その変換を行うための賭けの方法はありますか?