2

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(...)ですか?

4

1 に答える 1

1

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が必要ですtoBinStringbytes = {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()
于 2013-07-15T13:17:03.983 に答える