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