Currently I am trying to decode data (using lua). Data I have is 64 bit hexadecimal (big endian).
That specific number needs to be converted to little endian. Beside that other bitwise operations are going to be applied later based on the internal logic.
Now, initially I thought that things are going to be easy, having in mind that I can use bitop and simply apply any bitwise operations I would like to.
Now, unfortunately, I have (and please make a note that I am not able to change this), 32 bit lua compiler, hence, I am not simply able to use these operations.
There are 2 questions which I would like to ask:
If i have hex
800A000000000000
how can I use 32 bitwise operations (specifically in this case operations like bit.bswap, bit.rshift, bit.lshift from the library i shared above) on this
hexadecimal number? Is it possible to split this number on 2 parts,
and then apply operations on each of them and then merge them
together again? If that is the case, how?
Prior asking this question, I found and read other references to the same subject, but all of them are more related with specific cases (which is hard to understand unless you are familiar with the subject):
For Windows there are only several 32 bit interpreters like Lua for Windows one I currently use (at least as far as i know). On the server the interpreter is running the scripts on 64 bits. Now my question is: Is it possible to check on which architecture the script is running (probably similar to the _ENV variable for the version)?
a, b and n are Lua numbers. y is a 64-bit unsigned integer. x can be a Lua number or a 64-bit integer (signed or unsigned). The repository includes a C program that generates a test suite for the module.
LuaJIT library for bitwise operations on 64-bit integers. NOTE The bit libray in LuaJIT 2.1.0-beta3 supports 64-bit types (and JIT compiles them too!). This library is for older versions of LuaJIT.
There's one possible way though (maybe there's more). You can compile dummy function with string. dump () and analyze bytecode header. The header is different between Lua versions, so you should check the version first to know location of "system parameters" field.
After more detailed investigation regarding this topic, testing and communication with other people which opinion is relevant to this subject, posting an answer:
In this specific case, it really does not matter do you have 32 bit or 64 bit compiler (or device). The biggest integer you are able to represent based on lua doc: 64-bit floats can only represent integers up to 53 bits of precision, and the hex number I used as an example is bigger then that.
This means that any kind of general bit-wise operations are not going to work for these numbers.
Basically, this question can be reconstructed in: "How I can use bit wise operations in lua on full 64 bits?".
Only solution is to use libraries for this one or to implement it by yourself (separating 64 bit number to two 32 bit numbers and implementing bit wise operators by yourself)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With