2013-07-15 4 views
1

Я играю в Feed The Beast и хотел бы создать сеть. Я уже могу отправлять двоичные коды с одного компьютера на другой. Метод, чтобы получить двоичный код из строки заключается в следующем:Двоичный код для строки

function toBinString(s) 
    bytes = {string.byte(s,i,string.len(s))} 
    binary = "" 

    for i,number in ipairs(bytes) do 
    c = 0 

    while(number>0) do 
     binary = (number%2)..binary 
     number = number - (number%2) 
     number = number/2 
     c = c+1 
    end 

    while(c<8) do 
     binary = "0"..binary 
     c = c+1 
    end 
    end 

    return binary 
end 

function toBin(s) 
    binary = toBinString(s)  
    ret = {} 
    c = 1 

    for i=1,string.len(binary) do 
    char = string.sub(binary,i,i) 

    if(tonumber(char)==0) then 
     ret[c] = 0 
     c = c+1 
    elseif(tonumber(char)==1) then 
     ret[c] = 1 
     c = c+1 
    elseif(tonumber(char)) then 
     print("Error: expected \'0\' or \'1\' but got \'",char,"\'.") 
    end 
    end 

    return ret 
end 

Как я могу получить строку, которая была использована в string.byte(...)?

ответ

1

Вот одна возможность:

function toBinAndBack(s) 
    local bin = toBin(s) 
    local r = {} 
    for i=1,#bin,8 do 
    local n = 0 
    for j=0,7 do 
     n = n + (2^(7-j)) * bin[i+j] 
    end 
    r[#r+1] = n 
    end 
    return string.char(unpack(r)):reverse() 
end 

reverse в конце концов, это необходимо, потому что вы кодировать строки в обратном направлении в toBinString. Кроме того, мне пришлось заменить эту строку: bytes = {string.byte(s,i,string.len(s))} от bytes = {string.byte(s,1,-1)}, чтобы ваш код работал.

Обратите внимание, что использование unpack() ограничивает размер строки, которая может быть расшифрована. Если вы хотите, чтобы декодировать произвольно длинные строки, вы можете заменить последнюю строку (return string.char(unpack(r)):reverse()) этим:

for i=1,#r do 
    r[i] = string.char(r[i]) 
end 
return table.concat(r):reverse() 
+0

о 'байт = ...' вещь: он работал для меня (в игре), так что я имел никаких проблем: D В любом случае, я собираюсь использовать ваш код :) Большое спасибо. – mezzodrinker

+0

В 'bytes = ...' 'string.len (s)', вероятно, ОК, но 'i' никогда не определялся раньше. Это должно произойти из какой-то другой части вашего кода, я думаю :) – catwell

+0

Может быть, да. Я думаю, что Ctrl + C был причиной того, что 'i' был там: D – mezzodrinker

Смежные вопросы