Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.0k views
in Technique[技术] by (71.8m points)

lua - send hex variable via TCP socket

Probably it's an easy thing, but I'm a Lua beginner...
I'm creating a very simple QSC QSYS plugin to control a projection server using KVL API. Server API is based on hex strings.
For example this command asks the server to load a the playlist with 9bf5455689ed4c019731c6dd3c071f0e uuid:

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

Now I need to be able to create a string with a variable UUID, according to the text indicated in a textbox (or a list of available UUIDs read from the server) in the user interface. I will concatenate this string to the fixed part of the command. How can I correctly make a string like
ad17fc696b49454db17d593db3e553e5 become
xadx17xfcx69x6bx49x45x4dxb1x7dx59x3dxb3xe5x53xe5?

question from:https://stackoverflow.com/questions/65853030/send-hex-variable-via-tcp-socket

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Try this:

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

Explanation: this takes every pair of characters, interprets them as base 16 numeric string, and then takes the character with that number, and uses that to replace the original characters.


EDIT: To make it clear what's going on, and why the other answers are wrong, backslash escape sequences like xad are a feature of the Lua source code, in memory it's represented by a byte with value 173, just like A is represented by a byte with value 65. Trying to concatenate a literal backslash character with hexadecimal characters does not create an escape code. So the way to do that is manually with string.char.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...