2013-07-15 99 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

這是一個可能性:因爲你在編碼反向字符串toBinString

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末是必要的。另外,我必須替換這一行:bytes = {string.byte(s,i,string.len(s))} by 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是那個「我」在那裏的原因:D – mezzodrinker