1

基本的には数量に相当する5バイトを読みましたが、Word64に変換したいと思います。これを行うための最良の方法は何ですか?

編集:これは内部ループで実行されるため、パフォーマンスが重要であるとも言えます。理想的には、次のようなことをしたいと思います。

uint64_t word = 0;
char bytes[5] = getbytes(5)
word += (bytes[0] << 32) 
        + (bytes[1] << 24) 
        + (bytes[2] << 16) 
        + (bytes[3] << 8) 
        + (bytes[4])

または同様のもの。

4

2 に答える 2

1

ビッグエンディアンのバイトオーダーを想定した単純な関数が必要な場合は、次の関数を使用する必要があります。

foo :: B.ByteString -> Word64
foo = B.foldl' (\x y -> x * 256 + fromIntegral y) 0

ただし、大量のバイナリデータを読み取る場合は、binaryパッケージの使用を検討することをお勧めします。

于 2011-09-20T17:19:41.467 に答える
0

Hammarが言ったように、バイナリ(および厳密なバイト文字列バージョンのシリアル)は優れていますが、最速のソリューションよりもかなり低速です(Hammarのソリューションで提案されているのと同じシフトを実行します)。

単純なFFIルーチンが最速のソリューションであることがわかりました。

getNthWord n b = inlinePerformIO (unsafeUseAsCString b (flip peekElemOff n . castPtr))

build-depを追加する場合は、同様に高速なソリューションがVector.Storableベクターパッケージから使用することです。

これらはどちらも5バイトのビッグエンディアン形式を処理しないため、これを有効にするにはデータプロデューサーを変更する必要があることに注意してください。

PS FFIソリューションは、ワードアラインメントを前提としています。ユーザーがx86以外のシステムでそのルーチンを実行したときに、元々バグがありました。

于 2011-09-20T22:09:44.390 に答える