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

也许这很简单,但我是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正确地变成\xad\x17\xfc\x69\x6b\x49\x45\x4d\xb1\x7d\x59\x3d\xb3\xe5\x53\xe5

点赞
用户3342050
用户3342050
#! /usr/bin/env lua

str = 'ad17fc696b49454db17d593db3e553e5'
strx = ''

for i = 1, #str, 2 do  --  循环遍历字符串的每个奇数位置
    chars = str :sub( i, i+1 )  --  获取每两个字符
    strx = strx ..'\\x' ..chars
end  --  添加一个反斜杠,然后是字母x,然后是那两个字符

target = [[\xad\x17\xfc\x69\x6b\x49\x45\x4d\xb1\x7d\x59\x3d\xb3\xe5\x53\xe5]]
print( strx, strx == target )  --  打印结果,并测试它是否符合预期目标

\xad\x17\xfc\x69\x6b\x49\x45\x4d\xb1\x7d\x59\x3d\xb3\xe5\x53\xe5 true

这可以被编码压缩成一行代码

x=''for i=1,#s,2 do x=x..'\\x'..s:sub(i,i+1)end
2021-01-23 00:05:25
用户573255
用户573255

尝试这样做:

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进行手动转化。

2021-01-23 16:13:31