在lua中将字符串转换为十六进制?

时间:2015-04-02 17:53:20

标签: string sockets lua hex bytearray

我将通过socket发送一个字节数组。但我以前在c / c ++中工作并且是lua的新手。 现在我有一个问题,这是我的问题。

我想发送一个bytearray。它应该包含mac_address,string_length,string。

详细信息:

mac_address:6个字节 字符串长度:1个字节 string:几个字节

(1)第一个问题 现在,我有一个mac_address字符串,如“01:2f:c2:5e:b6:a3”,如何将其转换为6字节的十六进制数组?

(2)第二 如何定义无符号数并将其存储到字节?例如,sting_length为33,如何将其作为0x21存储到一个字节中?

(3)最后 如何将mac_address(6bits),string_length(1bit),data_string(例如,100bytes)组合成一个字节数组,并通过luasocket成功发送出去。

就是这样。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用string.char获取数字的符号表示,这样您就可以将数字打包成字节。这样的事情应该有效:

local function packet(address, str)
  return address:gsub("(%x+):?",function(s) return string.char(tonumber(s, 16)) end)
  .. string.char(#str)
  .. str
end

print(packet("10:2f:c2:5e:b6:a3", "abc") == "\16/\194^\182\163\3abc")

gsub获取地址中的每个组,tonumber(s, 16)将十六进制数转换为十进制数,string.char将其转换为字符(一个字节)表示。然后将它们打包成一个可以发送的字符串。这是结果字符串的Lua表示:"\16/\194^\182\163\3abc"

答案 1 :(得分:0)

function hexbyte(a,b)
b1=string.byte(a)
b2=string.byte(b)
result = 0 
  if (b1 >= string.byte('A')) then
     result = 16*result + b1 - string.byte('A') +10
           else
     result = 16*result + b1 - string.byte('0')
  end

  if (b2 >= string.byte('A')) then
     result = 16*result  + b2 - string.byte('A') +10
  else
     result = 16* result + b2 - string.byte('0')
 end
 return string.format('%02X', (result))
 end