Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
Lua 通过TCP套接字发送十六进制变量_Lua - Fatal编程技术网

Lua 通过TCP套接字发送十六进制变量

Lua 通过TCP套接字发送十六进制变量,lua,Lua,也许这是件容易的事,但我是Lua的初学者 我正在创建一个非常简单的QSC QSYS插件,以使用KVL API控制投影服务器。服务器API基于十六进制字符串 例如,此命令要求服务器加载播放列表中带有9bf5455689ed4c019731c6dd3c071f0euuid: Controls["LoadSPL"].EventHandler = function() sock:Write( "\x06\x0e\x2b\x34\x02\x05\x01

也许这是件容易的事,但我是Lua的初学者
我正在创建一个非常简单的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%的代码”的说法提出了异议,因为我接管的唯一部分是输入(这是问题的一部分)、变量名(无关紧要)和替换模式(无关紧要)。