私は現在 Source Engine プロトコルに取り組んでおり、将来の Rails プロジェクトで使用するためにライブラリを作成/移植しています。
私の質問は...この参考資料では、null で終わる文字列について述べています (これは常に '\0' だと思っていました)。
私が書いたこのライブラリ (関連するセグメントを添付) をテストしようとすると、機能しません。IRB では、null 終端が \u0000 (ユニコード) に変換されるためです。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
とにかく、どんな助けでも大歓迎です。これを読んでくれた皆さん、どうもありがとう。