String 在lua中将字符串转换为十六进制?
我打算通过socket发送一个字节数组,但我以前在c/c++中工作,对lua是新手。 现在我有一个问题,这是我的问题 我想发送一个字节数组。它应该包含mac地址、字符串长度、字符串 详情如下: mac_地址:6字节 字符串长度:1字节 字符串:几个字节 (1) 第一个问题 现在,我有一个mac_地址字符串,如“01:2f:c2:5e:b6:a3”,如何将其转换为6字节十六进制数组 (2) 第二 如何定义无符号数并将其存储到字节中?例如,sting_长度为33,如何将其存储为0x21到字节中 (3) 最后 如何将mac_地址(6位)、字符串长度(1位)、数据_字符串(例如100字节)组合成一个字节数组,并通过luasocket成功发送出去 就这些String 在lua中将字符串转换为十六进制?,string,sockets,lua,hex,bytearray,String,Sockets,Lua,Hex,Bytearray,我打算通过socket发送一个字节数组,但我以前在c/c++中工作,对lua是新手。 现在我有一个问题,这是我的问题 我想发送一个字节数组。它应该包含mac地址、字符串长度、字符串 详情如下: mac_地址:6字节 字符串长度:1字节 字符串:几个字节 (1) 第一个问题 现在,我有一个mac_地址字符串,如“01:2f:c2:5e:b6:a3”,如何将其转换为6字节十六进制数组 (2) 第二 如何定义无符号数并将其存储到字节中?例如,sting_长度为33,如何将其存储为0x21到字节中 (3
谢谢大家! 您可以使用
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”
您应该使用%x
而不是%w
它需要两个特许,例如“C”和“3”,并返回十六进制C3。另外,如果您需要0xC3的小数点,即195,那么您可以简单地执行返回结果
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