我目前正在使用 Source Engine 协议,编写/移植一个库以用于未来的 Rails 项目。
我的问题是......在这个参考资料中,它谈到了以空结尾的字符串(我一直认为是'\ 0')。
当我去测试我编写的这个库时(附上相关部分),它不起作用,因为在 IRB 中,它将我的空终止转换为 \u0000 (unicode)。如何解决此问题以处理将在 UDP 数据包中传入的数据?我认为问题与编码有关。
# Get a null ('/0') terminated string from the buffer.
def get_string
zero_byte = @buffer.index('\0',@position)
if zero_byte === nil
string = ''
else
string = get(zero_byte-@position)
@position+=1
end
string
end
基本上,它应该找到一个“空”字符,然后获取该数据块并将其作为字符串返回,然后将缓冲区中的“位置”移动到空字符,以便进一步读取它。
当我在 ERB 中运行它时,会发生以下情况:
2.0.0-p247 :001 > load 'source_buffer.rb'
=> true
2.0.0-p247 :002 > b = SourceBuffer.new
=> #<SourceBuffer:0x000000023d56d8>
2.0.0-p247 :003 > b.set("Source Engine Query\0")
=> 0
2.0.0-p247 :004 > b.get_string
=> ""
2.0.0-p247 :005 > b.buffer
=> "Source Engine Query\u0000"
如您所见,我放入缓冲区的 '\0' 正在转换为 Unicode,这破坏了我的 IRB 测试。
当一切都说完后,这将与以下协议一起使用,不确定此时是否立即相关:
https://developer.valvesoftware.com/wiki/Server_queries
无论如何,任何帮助将不胜感激。非常感谢,感谢所有阅读本文的人。