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



可能这是一件容易的事情,但我是一个Lua初学者…
我正在创建一个非常简单的QSC QSYS插件来控制使用KVL API的投影服务器。服务器API基于十六进制字符串。
例如,这个命令要求服务器加载一个具有9bf5455689ed4c019731c6dd3c071f0euuid的播放列表:

Controls["LoadSPL"].EventHandler = function()
sock:Write(
"x06x0ex2bx34x02x05x01x0ax0ex10x01x01x01x03x09x00x83x00x00x14x00x00x00x01x9bxf5x45x56x89xedx4cx01x97x31xc6xddx3cx07x1fx0e"
)
end

现在,我需要能够根据用户界面中的文本框(或从服务器读取的可用UUID列表)中指示的文本创建一个具有可变UUID的字符串。我将把这个字符串连接到命令的固定部分。我如何正确地使字符串像
ad17fc696b49454db17d593db3e553e5变成
xadx17xfcx69x6bx49x45x4dxb1x7dx59x3dxb3xe5x53xe5?

试试这个:

local input = "ad17fc696b49454db17d593db3e553e5"
local output = input:gsub("%w%w", function(s) return string.char(tonumber(s, 16)) end)

解释:这将取每一对字符,将它们解释为十六进制的数字字符串,然后取带有该数字的字符,并使用该字符替换原始字符。


编辑:为了清楚发生了什么,以及为什么其他答案是错误的,反斜杠转义序列如xad是Lua源代码的一个特征,在内存中它由一个值为173的字节表示,就像A由一个值为65的字节表示。尝试将文字反斜杠字符与十六进制字符连接不会创建转义代码。所以这样做的方法是手动使用string.char

#! /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 = [[xadx17xfcx69x6bx49x45x4dxb1x7dx59x3dxb3xe5x53xe5]]
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

最新更新