Как правильно переписать строки из C# в луа?

FakeSince

Активный
Автор темы
245
55
Версия MoonLoader
.026-beta
Есть такие вот строки, мне нужно что-то подобное на луа
C:
BitStreamSharp sharp = new BitStreamSharp(data)
ushort num = (ushort) sharp.readUInteger(2, false);
uint num2 = sharp.readUInteger(4, false);
byte num3 = (byte) sharp.readUInteger(1, false);
string content = sharp.ReadString(4).Replace("\0", "");
насчёт num3 и content пробовал делать так:
Lua:
local bs = bitStream.new()
local num3 = bs:readUInt16()
local content = bs:ReadString():gsub("\0", "");
пытался их вывести, через print ничего не выводится
 
Решение
библиотека RakLua есть
Тогда так получается.
Lua:
RakLua.registerHandler(RakLuaEvents.INCOMING_RPC,
    function(id, bs)
        if id == 137 then
            local id = bs:readInt16()
            local color = bs:readInt32()
            local isNpc = bs:readUInt8()
            local name = bs:readString(bs:readInt8())
            onPlayerJoin(id, color, isNpc, name)
        end
    end
)

function onPlayerJoin(id, color, isNpc, name)
  
end

P.S. Исправил битность, а то перепутал, когда копировал.

Hatiko

Известный
Проверенный
1,472
611
Смотри функции, которые начинаются с "raknet".
Для чтения с "нуля" класса битстрим используются функции onReceiveRpc(id, bs) и onReceivePacket(id, bs). При чтении битистрим указывается в самой функцией.
К примеру, Rpc - onServerMessage
Lua:
function onReceiveRpc(id, bs)
    if id == 93 then
        local color = raknetBitStreamReadInt32(id)
        local len = raknetBitStreamReadInt32(bs)
        local text = raknetBitStreamReadString(bs, len)
        
    end
end
Создание битстрима raknetNewBitStream() используется для эмуляции отправки.
 

RedHolms

Известный
Проверенный
617
360
Зависит от имплементации

Как я понял, тебе нужно считать поля RPC ServerJoin, вот как это будет на стандартных функциях:
Lua:
-- bs - bitstream
local playerId = raknetBitStreamReadInt16(bs)
local color = raknetBitStreamReadInt32(bs)
local isNpc = raknetBitStreamReadBool(bs) -- Можно использовать raknetBitStreamReadInt8
local name = raknetBitStreamReadString(bs, raknetBitStreamReadInt8(bs))
 

Hatiko

Известный
Проверенный
1,472
611
raknetBitStreamReadBool(bs) -- Можно использовать raknetBitStreamReadInt8
Не совсем, имеется разница. Чистый Bool считывает ровно 1 бит, а второе 8 бит.
На счет чтения в RPC не проверял, но при чтении пакетов нельзя использовать 8-битную булку, где просят именно 1 бит прочесть.
 

FakeSince

Активный
Автор темы
245
55
Смотри функции, которые начинаются с "raknet".
Для чтения с "нуля" класса битстрим используются функции onReceiveRpc(id, bs) и onReceivePacket(id, bs). При чтении битистрим указывается в самой функцией.
К примеру, Rpc - onServerMessage
Lua:
function onReceiveRpc(id, bs)
    if id == 93 then
        local color = raknetBitStreamReadInt32(id)
        local len = raknetBitStreamReadInt32(bs)
        local text = raknetBitStreamReadString(bs, len)
       
    end
end
Создание битстрима raknetNewBitStream() используется для эмуляции отправки.
У меня вместо RakNET библиотека RakLua есть, но вообщем суть я +- понял, буду пробовать что то

Зависит от имплементации

Как я понял, тебе нужно считать поля RPC ServerJoin, вот как это будет на стандартных функциях:
Lua:
-- bs - bitstream
local playerId = raknetBitStreamReadInt16(bs)
local color = raknetBitStreamReadInt32(bs)
local isNpc = raknetBitStreamReadBool(bs) -- Можно использовать raknetBitStreamReadInt8
local name = raknetBitStreamReadString(bs, raknetBitStreamReadInt8(bs))
У меня тут кастом пакеты, по сути мне нужно просто сделать эту строку в луа:
byte num3 = (byte) sharp.readUInteger(1, false);
и эту:
string content = sharp.ReadString(4).Replace("\0", "");
А там уже сделать проверку на них, ну проверку через if я и сам смогу сделать, нужно правильно эти строки сделать
 

Hatiko

Известный
Проверенный
1,472
611
библиотека RakLua есть
Тогда так получается.
Lua:
RakLua.registerHandler(RakLuaEvents.INCOMING_RPC,
    function(id, bs)
        if id == 137 then
            local id = bs:readInt16()
            local color = bs:readInt32()
            local isNpc = bs:readUInt8()
            local name = bs:readString(bs:readInt8())
            onPlayerJoin(id, color, isNpc, name)
        end
    end
)

function onPlayerJoin(id, color, isNpc, name)
  
end

P.S. Исправил битность, а то перепутал, когда копировал.
 

FakeSince

Активный
Автор темы
245
55
Тогда так получается.
Lua:
RakLua.registerHandler(RakLuaEvents.INCOMING_RPC,
    function(id, bs)
        if id == 137 then
            local id = bs:readInt16()
            local color = bs:readInt32()
            local isNpc = bs:readUInt8()
            local name = bs:readString(bs:readInt8())
            onPlayerJoin(id, color, isNpc, name)
        end
    end
)

function onPlayerJoin(id, color, isNpc, name)
 
end

P.S. Исправил битность, а то перепутал, когда копировал.
То есть, в c# readUInteger(1, false); это readInt32() в луа? и ReadString(4) в c# = bs:readString(bs:readInt8()) в луа?
 

Hatiko

Известный
Проверенный
1,472
611
То есть, в c# readUInteger(1, false); это readInt32() в луа? и ReadString(4) в c# = bs:readString(bs:readInt8()) в луа?
Ну тут говорить про "в луа" некорректно, это чисто вариант реализации с помощью данной библиотеки на lua. Вот есть оф.тема (https://www.blast.hk/threads/69433/) данной библиотеки и в левой колонке описываются методы для работы с битстримом.
local value = bs:readUInt(8/16/32)() -- uint8/16/32; к примеру чтения беззнакового 2 байта (16) - bs:readUInt16()
Для чтения строки, тебе требуется прочитать значение длины, а после читаешь строку с указанием длины строки.
 

FakeSince

Активный
Автор темы
245
55
Ну тут говорить про "в луа" некорректно, это чисто вариант реализации с помощью данной библиотеки на lua. Вот есть оф.тема (https://www.blast.hk/threads/69433/) данной библиотеки и в левой колонке описываются методы для работы с битстримом.
local value = bs:readUInt(8/16/32)() -- uint8/16/32; к примеру чтения беззнакового 2 байта (16) - bs:readUInt16()
Для чтения строки, тебе требуется прочитать значение длины, а после читаешь строку с указанием длины строки.
сча в лс отпишу короче