1

我目前正在使用 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

无论如何,任何帮助将不胜感激。非常感谢,感谢所有阅读本文的人。

4

0 回答 0