在lua中将字符串转换为十六进制?
我打算通过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成功发送出去。
就是这样。
谢谢!
您可以使用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"
。
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
请提供您的代码的解释。 – OldMcDonald 2016-08-10 12:00:53
它需要两个章程,例如'C'和'3'并返回十六进制C3。 另外,如果你需要0xC3的小数,那么你可以简单地做 返回结果 – 2016-08-11 07:40:19
您应该使用'%x'而不是'%w' – hjpotter92 2015-04-03 07:40:19
正确;更新。谢谢。 – 2015-04-03 15:21:54