Как преобразовать строку в uint32 и отправить ее на сервер в Lua?

Я хочу использовать 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. измените его на обратный порядок байтов

Я хочу знать, как решить эту проблему.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш вопрос очень неясен. Вы хотите:

  1. Преобразование числа ("uint32") в строку байтов (маленький порядок байтов? сетевой порядок байтов обычно большой)
  2. Преобразование строки байтов (с прямым порядком байтов) в число ("uint32")
  3. Преобразование строк байтов с прямым порядком байтов в строки байтов с прямым порядком байтов и наоборот может быть тривиально выполнено с помощью 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

Да!Спасибо за ваш ответ и, пожалуйста, извините за описание проблемы. Мой английский не очень хорош. У меня есть еще один вопрос, что мне делать, если я хочу преобразовать все биты, отличные от uint32, в unit32?

sp1ke 28.11.2022 03:56

@sp1ke, что ты имеешь в виду? В моем ответе есть преобразование «байты в uint».

Luatic 28.11.2022 10:04

Другие вопросы по теме