bitstream в строку

Tornamic

Известный
Автор темы
50
176
Версия MoonLoader
Другое
как перевести аргументы rpc в строку? чтобы в onReceiveRpc любой bitstream переводился в строку с аргументами rpc_name [arg1] [arg2]....
 
Решение
это ясно, возможно ли "автоматом" парсить в нужный тип байты которые получаешь с bs? как я понимаю нет, придется генерировать код для каждого rpc
именно). в целом, можешь посмотреть реализацию чтения каждого RPC и пакета в samp.events

whyega52

Eblang головного мозга
Модератор
2,870
2,852
как перевести аргументы rpc в строку? чтобы в onReceiveRpc любой bitstream переводился в строку с аргументами rpc_name [arg1] [arg2]....
Не совсем в том формате, как ты просил, но думаю сам сможешь поменять
Lua:
-- 1 вариант
addEventHandler("onReceiveRpc", function(id, bs)
    local bytes = {}
    local length = raknetBitStreamGetNumberOfBytesUsed(bs)
    for i = 1, length do
        table.insert(bytes, raknetBitStreamReadInt8(bs))
    end
    print(raknetGetRpcName(id), table.concat(bytes, ", "))
end)


-- 2 варинт (не уверен в его работе, но можешь попробовать)
addEventHandler("onReceiveRpc", function(id, bs)
    local length = raknetBitStreamGetNumberOfBytesUsed(bs)
    local bytes = 0
    for _ = 1, length do
        bytes = bytes * 256 + raknetBitStreamReadInt8(bs)
    end
    print(("%s %X"):format(raknetGetRpcName(id), bytes))
end)
 

Tornamic

Известный
Автор темы
50
176
Не совсем в том формате, как ты просил, но думаю сам сможешь поменять
Lua:
-- 1 вариант
addEventHandler("onReceiveRpc", function(id, bs)
    local bytes = {}
    local length = raknetBitStreamGetNumberOfBytesUsed(bs)
    for i = 1, length do
        table.insert(bytes, raknetBitStreamReadInt8(bs))
    end
    print(raknetGetRpcName(id), table.concat(bytes, ", "))
end)


-- 2 варинт (не уверен в его работе, но можешь попробовать)
addEventHandler("onReceiveRpc", function(id, bs)
    local length = raknetBitStreamGetNumberOfBytesUsed(bs)
    local bytes = 0
    for _ = 1, length do
        bytes = bytes * 256 + raknetBitStreamReadInt8(bs)
    end
    print(("%s %X"):format(raknetGetRpcName(id), bytes))
end)
первый вариант рабочий, каким способом можно парсить byte в string/float/int?
 

whyega52

Eblang головного мозга
Модератор
2,870
2,852
первый вариант рабочий, каким способом можно парсить byte в string/float/int?

Lua:
-- string:
print(string.char(72, 69, 76, 76, 79, 32, 78, 73, 71, 71, 69, 82, 83)) -- output: HELLO NIGGERS


local byte = 7860

--int
print(tonumber(ffi.cast("int", byte)))

--char
print(tonumber(ffi.cast("char", byte)))

--float
print(tonumber(ffi.cast("float", byte)))
 

Tornamic

Известный
Автор темы
50
176
Lua:
-- string:
print(string.char(72, 69, 76, 76, 79, 32, 78, 73, 71, 71, 69, 82, 83)) -- output: HELLO NIGGERS


local byte = 7860

--int
print(tonumber(ffi.cast("int", byte)))

--char
print(tonumber(ffi.cast("char", byte)))

--float
print(tonumber(ffi.cast("float", byte)))
это ясно, возможно ли "автоматом" парсить в нужный тип байты которые получаешь с bs? как я понимаю нет, придется генерировать код для каждого rpc
 
  • Нравится
Реакции: whyega52

whyega52

Eblang головного мозга
Модератор
2,870
2,852
это ясно, возможно ли "автоматом" парсить в нужный тип байты которые получаешь с bs? как я понимаю нет, придется генерировать код для каждого rpc
именно). в целом, можешь посмотреть реализацию чтения каждого RPC и пакета в samp.events
 
  • Влюблен
Реакции: Tornamic

whyega52

Eblang головного мозга
Модератор
2,870
2,852
Список почти всех входящих rpc (кроме тех, у которых нет параметров), генерировал C# кодом
Pastebin
Хах, неплохо. Но в луа есть таблицы, благодаря которым можно было бы упростить код (как в самп.евентс). А то сейчас коду ооочень плохо
 
  • Нравится
Реакции: Tornamic

Tornamic

Известный
Автор темы
50
176
Хах, неплохо. Но в луа есть таблицы, благодаря которым можно было бы упростить код (как в самп.евентс). А то сейчас коду ооочень плохо
в луа ничего не понимаю, пишу чтобы хоть как-то работало, нет времени и желания разбираться
 
  • Вау
Реакции: whyega52