Я хочу использовать lua для отправки TCP-сообщений на сервер. Сервер запрашивает отправку ему потока байтов uint32 с прямым порядком байтов. Но у моего lua нет string.pack и string.unpack. Как добиться этого только с lua, но не с?
Мое мнение это: 1.конвертирует не в формате uint32 в uint32
function UIUtils.GetStr2ID(strID)
return (string.byte(strID, 1) << 24) | (string.byte(strID, 2) << 16) | (string.byte(strID, 3) << 8) | (string.byte(strID, 4))
end
2. измените его на обратный порядок байтов
Я хочу знать, как решить эту проблему.
Ваш вопрос очень неясен. Вы хотите:
str:reverse()
, где str
— строка.Вывод представляет собой 4-байтовую строку с прямым порядком байтов.
local floor = math.floor
local function uint32_to_bytestr(n)
assert(n % 1 == 0 and n >= 0 and n < 2^32, "n does not fit in a uint32")
return ("%c%c%c%c"):format(
n % 0x100,
floor(n / 0x100) % 0x100,
floor(n / 0x10000) % 0x100,
floor(n / 0x1000000) % 0x100
)
end
Ввод — это 4-байтовая строка с прямым порядком байтов, вывод — число от 0
до 2^32-1
.
local function bytestr_to_uint32(str)
assert(#str == 4, "byte string is not 4 bytes long")
return str:byte(1)
+ str:byte(2) * 0x100
+ str:byte(3) * 0x10000
+ str:byte(4) * 0x1000000
end
@sp1ke, что ты имеешь в виду? В моем ответе есть преобразование «байты в uint».
Да!Спасибо за ваш ответ и, пожалуйста, извините за описание проблемы. Мой английский не очень хорош. У меня есть еще один вопрос, что мне делать, если я хочу преобразовать все биты, отличные от uint32, в unit32?