Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在lua中将字符串转换为十六进制?_String_Sockets_Lua_Hex_Bytearray - Fatal编程技术网

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

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

我打算通过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.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