2017-11-17 2 views
1

Nehmen Sie y = 1510751840. Angenommen, Sie möchten die 6-Byte-Little-Endian-Sequenz von Bytes der Zahl y * 1000. Du benutzt Lua 5.1. Wie kannst du es bekommen? Es gibt keinen ganzzahligen Datentyp, nur double, was der Standard von Lua ist. Wie kann das gemacht werden?6-Byte-Little-Endian-Sequenz von 32-Bit-Zeitstempel multipliziert mit 1000

Zum Beispiel, wenn y = 1510743753, die 6-Byte-Reihenfolge sollte sein: 01 5f bf 58 41 28.

Thank you!

Warum frage ich? Ich muss eine Little-Endian-Sequenz für die Anzahl von Millisekunden seit der UNIX-Epoche erzeugen, die ein Lua-Embedded-System verwendet. Ich habe nur die Anzahl der Sekunden und so kann ich eine Little-Endian-4-Byte-Sequenz dieser Nummer erzeugen. Aber ich muss eine 6-Byte-, 48-Bit-Byte-Sequenz erzeugen. Also meine Idee ist es, den 32-Bit Zeitstempel mit 1000 zu multiplizieren, aber ich kann diese Zahl in meinem Lua 5.1 Embeddable System nicht multiplizieren. So hoffe ich, für einen Hack, der mir die 6-Byte-Sequenz entsprechend dem Zeitstempel * erhalten können 1000.

+0

Wenn Sie LuaRocks Module installieren können, bit32 sollte integer-basierte bitweise Operationen ermöglichen: https://luarocks.org/modules/siffiejoe/bit32 – Afforess

Antwort

0
local y = 1510743753 

local lo16 = y % 2^16 * 1000 % 2^16 
local hi32 = (y - y % 2^16)/2^16 * 1000 + (y % 2^16 * 1000 - lo16)/2^16 

print(("%08x %04x"):format(hi32, lo16)) --> 015fbf58 4128 
0

Ein alternativer Ansatz:

function byte_n(val,byte_num) 
    val = val * 1000 
    for i = 1, byte_num-1 do 
    val = ('%.0f'):format((val - val % 256)/256) 
    end 
    return ('%02x'):format(val % 256) 
end 

y = 1510743753  --> 01 5f bf 58 41 28 

print(byte_n(y,6)) --MSB 
print(byte_n(y,5)) 
print(byte_n(y,4)) 
print(byte_n(y,3)) 
print(byte_n(y,2)) 
print(byte_n(y,1)) --LSB 
Verwandte Themen