2015-04-02 1043 views
2

我打算通过socket发送一个字节数组,但我曾经在c/C++中工作过,并且对lua来说是新的。 现在我有一个问题,这是我的问题。在lua中将字符串转换为十六进制?

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

对于细节:

MAC_ADDRESS:6个字节 长度字符串的:1个字节 字符串:若干字节

(1)第一个问题 现在,我有MAC_ADDRESS的像“01的字符串:2F :c2:5e:b6:a3“,我怎么把它转换成一个6字节的十六进制数组?

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

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

就是这样。

谢谢!

回答

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"

+0

您应该使用'%x'而不是'%w' – hjpotter92 2015-04-03 07:40:19

+0

正确;更新。谢谢。 – 2015-04-03 15:21:54

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 
+0

请提供您的代码的解释。 – OldMcDonald 2016-08-10 12:00:53

+0

它需要两个章程,例如'C'和'3'并返回十六进制C3。 另外,如果你需要0xC3的小数,那么你可以简单地做 返回结果 – 2016-08-11 07:40:19

相关问题