尝试索引数字值

GetSPLListResponse = "030200"

-- 播放列表容器
playlistsUUID = {}
playlistname = {}

-- 与服务器的TCP连接
address = Properties[“IP_Address”].Value
port = 11730
sock = TcpSocket.New()
sock.ReadTimeout = 0
sock.WriteTimeout = 0
sock.ReconnectTimeout = 5

sock.EventHandler = function(sock, evt, err)
    if evt == TcpSocket.Events.Connected then
        print("服务器已连接")
    elseif evt == TcpSocket.Events.Reconnect then
        print("服务器正在重新连接...")
    elseif evt == TcpSocket.Events.Data then
        print("服务器有数据")
        print("Socket缓冲区长度: " .. sock.BufferLength)
        buflen = sock.BufferLength
        message = sock:Read(buflen)
        messagestring =
              -- 将HEX消息转换为字符串
              message:gsub(
              '.',
              function(c)
                return string.format('%02X', string.byte(c))
              end
              )
              print("HEX转字符串后的消息:" .. messagestring)

        if string.find(messagestring, GetSPLListResponse) then -- 获取SPL UUID列表
            print("已收到GetSPLList响应")
            playlistsUUID = math.floor((#message - 16) / 16) -- 计算播放列表的数量
            print("已计算播放列表数:" .. playlistsUUID)

            for i = 1, playlistsUUID do -- 将每个播放列表数据放入数组中
                playlistsUUID[i] = string.sub(messagestring, i * 16, i * 16 + 16) -- 将数据分为16个字节的片段放入数组中
            end
            Controls.PlaylistBox.Choices = playlistsUUID

我试图创建一个包含远程服务器上每个可用播放列表UUID的数组,但当执行 playlistsUUID[i] = string.sub(messagestring, i * 16, i * 16 + 16) 时,我收到一个 尝试索引数字值(全局变量‘playlistsUUID’) 错误。

HEX转换为字符串后的典型 messagestring 为:060E2B340205010A0E100101010302008300002D000000010000000200000010AD17FC696B49454DB17D593DB3E553E59BF5455689ED4C019731C6DD3C071F0E00

点赞
用户10953006
用户10953006

我认为你需要一个额外的变量 PlaylistCount 才能让它工作。

如果你用 math.floor 重写变量 playlistsUUID,那么 playlistsUUID 就变成了一个数字类型。后来,当你写 playlistsUUID[i] 的时候,你试图引用一个表(table),但是 playlistsUUID 的类型是数字(number)。因此,由于类型不正确,Lua 会抛出执行错误。

GetSPLListResponse = "030200"

-- 播放列表容器
playlistsUUID = {}
playlistname = {}

-- 与服务器的TCP连接
address = Properties["IP_Address"].Value
port = 11730
sock = TcpSocket.New()
sock.ReadTimeout = 0
sock.WriteTimeout = 0
sock.ReconnectTimeout = 5

sock.EventHandler = function(sock, evt, err)
    if evt == TcpSocket.Events.Connected then
        print("服务器已连接")
    elseif evt == TcpSocket.Events.Reconnect then
        print("服务器重新连接中...")
    elseif evt == TcpSocket.Events.Data then
        print("服务器有数据")
        print("Socket缓冲区长度:" .. sock.BufferLength)
        buflen = sock.BufferLength
        message = sock:Read(buflen)
        messagestring =      -- 将HEX消息转换为字符串
              message:gsub(
              '.',
              function(c)
                return string.format('%02X', string.byte(c))
              end
              )
              print("HEX转换为字符串之后的消息:" .. messagestring)

        if string.find(messagestring, GetSPLListResponse) then -- 获取SPL UUID列表
            print("已收到GetSPLList应答")
            PlaylistCount = math.floor((#message - 16) / 16) -- 计算播放列表的数量
            print("计算得到的播放列表数量为:" .. PlaylistCount)

            for i = 1, PlaylistCount do -- 将每个播放列表数据放入一个数组中
                playlistsUUID[i] = string.sub(messagestring, i * 16, i * 16 + 16) -- 将数据划分为16字节的块,放入数组中
            end
            Controls.PlaylistBox.Choices = playlistsUUID
2021-02-04 11:53:57