私はバイナリファイルに小さな(16ビットまで)符号付き整数をシリアル化する必要があるプログラムを書いています。その一環として、整数を2バイトに分割する関数と、このバイトのペアを元の整数に戻す関数を記述する必要があります。Luaを使用してバイトのペアを符号付き16ビット整数に変換するにはどうすればよいですか?
私の心に来た最初のアイデアは、私はCにそれを解決する方法と同様に、この問題を解決することでした:Luaの整数は実際に64ビットとIを持っているので
function dump_i16(n)
assert (-0x8000 <= n and n < 0x8000) -- 16 bit
local b1 = (n >> 8) & 0xff
local b2 = (n >> 0) & 0xff
return b1, b2
end
function read_i16(b1, b2)
assert (0 <= b1 and b1 <= 0xff) -- 8 bit
assert (0 <= b2 and b2 <= 0xff) -- 8 bit
return (b1 << 8) | (b2 << 0)
end
しかし、これらの関数は負の数値でブレークそれが負の数のために正しく動作するように、私のread_i16
機能を変更するためのクリーンな方法は何でしょう
-- Positive numbers are OK
print(read_i16(dump_i16(17))) -- 17
print(read_i16(dump_i16(42))) -- 42
-- Negative numbers don't round trip.
print(read_i16(dump_i16(-1))) -- 65535 = 2^16 - 1
print(read_i16(dump_i16(-20))) -- 65516 = 2^16 - 20
:下位16ビットのみを保持するのですか?
可能であれば、Cコードを書くことなく、純粋なLua 5.3を使用してこれを行うことをお勧めします。
あなたのdump_i16は符号なしの値[0,256]を生成していますので、常にアサーションを失敗します。 – Moop
あなたは 'read_i16(dump_i16(-20)== 65516'と' 65516 == 2^16 -20'なぜあなたは結果から '2^16'を引いてみませんか? – siffiejoe
@Moop:そうです。真夜中にそれらを編集する前にテストしたはずです... – hugomg