Lua 通过TCP套接字发送十六进制变量
也许这是件容易的事,但我是Lua的初学者Lua 通过TCP套接字发送十六进制变量,lua,Lua,也许这是件容易的事,但我是Lua的初学者 我正在创建一个非常简单的QSC QSYS插件,以使用KVL API控制投影服务器。服务器API基于十六进制字符串 例如,此命令要求服务器加载播放列表中带有9bf5455689ed4c019731c6dd3c071f0euuid: Controls["LoadSPL"].EventHandler = function() sock:Write( "\x06\x0e\x2b\x34\x02\x05\x01
我正在创建一个非常简单的QSC QSYS插件,以使用KVL API控制投影服务器。服务器API基于十六进制字符串
例如,此命令要求服务器加载播放列表中带有
9bf5455689ed4c019731c6dd3c071f0e
uuid:
Controls["LoadSPL"].EventHandler = function()
sock:Write(
"\x06\x0e\x2b\x34\x02\x05\x01\x0a\x0e\x10\x01\x01\x01\x03\x09\x00\x83\x00\x00\x14\x00\x00\x00\x01\x9b\xf5\x45\x56\x89\xed\x4c\x01\x97\x31\xc6\xdd\x3c\x07\x1f\x0e"
)
end
现在,我需要能够根据用户界面中文本框(或从服务器读取的可用UUID列表)中指示的文本,使用变量UUID创建一个字符串。
我将把这个字符串连接到命令的固定部分。
我如何正确地制作一个字符串,如ad17fc696b49454db17d593db3e553e5
been\xad\x17\xfc\x69\x6b\x49\x45\x4d\xb1\x7d\x59\x3d\xb3\xe5\x53\xe5
#! /usr/bin/env lua
str = 'ad17fc696b49454db17d593db3e553e5'
strx = ''
for i = 1, #str, 2 do -- loop through every-other position in your string
chars = str :sub( i, i+1 ) -- capture every 2 chars
strx = strx ..'\\x' ..chars
end -- append a literal backslash, the letter x, then those 2 chars
target = [[\xad\x17\xfc\x69\x6b\x49\x45\x4d\xb1\x7d\x59\x3d\xb3\xe5\x53\xe5]]
print( x, x == target ) -- print results, and test if it meets expected target
\xad\x17\xfc\x69\x6b\x49\x45\x4d\xb1\x7d\x59\x3d\xb3\xe5\x53\xe5为真
这可以编码成一行
x=''for i=1,#s,2 do x=x..'\\x'..s:sub(i,i+1)end
试试这个:
local input = "ad17fc696b49454db17d593db3e553e5"
local output = input:gsub("%w%w", function(s) return string.char(tonumber(s, 16)) end)
说明:这将获取每对字符,将它们解释为以16为基数的数字字符串,然后获取具有该数字的字符,并使用该数字替换原始字符
编辑:为了弄清楚发生了什么,以及为什么其他答案是错误的,像
\xad
这样的反斜杠转义序列是Lua源代码的一个特性,在内存中它由一个值为173
的字节表示,就像a
由一个值为65
的字节表示一样。尝试将文字反斜杠字符与十六进制字符连接不会创建转义码。因此,方法是手动使用string.char
谢谢。代码将创建正确的字符串。但是,当我尝试将其连接到代码“\x06\x0e\x2b\x34\x02\x05\x01\x0a\x0e\x10\x01\x01\x01\x01\x03\x03\x00\x83\x00\x00\x14\x00\x00\x01”的第一部分时,结果是第一部分通过套接字以十六进制形式正确发送,但第二部分以“\x”作为文本的一部分发送itself@EliaO我听不懂那句话。请将这些信息添加到问题中,并提供一个示例。他们的答案不正确,他们生成字符串“\\xad\\x17\\xfc\\x69\\x6b\\x49\\x45\\x4d\\xb1\\x7d\\x59\\x3d\\xb3\\xe5\\x53\\xe5”
。OP在评论中写道“第二部分随“\x”一起发送,作为文本本身的一部分”。我对答案投了反对票,因为我知道答案是错误的。我还对“他们90%的代码”的说法提出了异议,因为我接管的唯一部分是输入(这是问题的一部分)、变量名(无关紧要)和替换模式(无关紧要)。