【问题标题】:send hex variable via TCP socket通过 TCP 套接字发送十六进制变量
【发布时间】:2021-01-29 20:54:53
【问题描述】:

可能这很容易,但我是 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

【问题讨论】:

    标签: lua


    【解决方案1】:

    试试这个:

    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

    【讨论】:

    • 他们的答案不正确,他们产生了字符串"\\xad\\x17\\xfc\\x69\\x6b\\x49\\x45\\x4d\\xb1\\x7d\\x59\\x3d\\xb3\\xe5\\x53\\xe5"。 OP 在评论中写道“第二部分与“\x”一起作为文本本身的一部分发送”。我对答案投了反对票,因为我知道它们是不正确的。我也对“他们 90% 的代码”的说法提出异议,因为我接管的唯一部分是输入(这是问题的一部分)、变量名(无关紧要)和替换模式(即琐碎)。
    【解决方案2】:
    #! /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
    

    【讨论】:

    • 谢谢。该代码创建了正确的字符串。但是,当我尝试将其连接到代码的第一部分“\x06\x0e\x2b\x34\x02\x05\x01\x0a\x0e\x10\x01\x01\x01\x03\x03\x00\x83 \x00\x00\x14\x00\x00\x00\x01" 结果是第一部分通过套接字正确发送为十六进制,但第二部分以“\x”作为文本本身的一部分发送
    • @EliaO 我无法理解该评论。请将该信息添加到您的问题中并提供示例
    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    相关资源
    最近更新 更多