2017-12-30 20 views
1

私はAPIアプリケーションを更新しています。新しいバージョンは、通信にバッファを使用します。Ruby + Python Pack

python-clientがあります。メッセージは、これは、Rubyに変換

struct.pack("!I%ds" % len(text),len(text),str(encode(text)) 

が詰め込まれています。

[text.size,text].pack("Na*") 

は、しかし、小さな違いがあります。 文字列のサイズが10未満の場合、最初の項は15より大きい場合は等しくなります。しかし、彼らは10と15の間であれば

...間

[5].pack "N" => "\x00\x00\x00\x05"

[11].pack "N" => "\x00\x00\x00\v"

[15].pack "N" => "\x00\x00\x00\x0F"

[16].pack "N" => "\x00\x00\x00\x10"

struct.pack("!I", 5) --> '\x00\x00\x00\x05'

struct.pack("!I",11) --> '\x00\x00\x00\x0b'

struct.pack("!I",15) -->'\x00\x00\x00\x0f'

struct.pack("!I",16) --> '\x00\x00\x00\x10'

にAPIがルビー満載のシーケンスの大きさを認識していないものがある、私は逃したとどのように私は適応することができますか?

p.s.違いは、ruby-versions(2.2,2.4 + 2.5でテスト済み)から独立しているようです。

+0

JSONまたはYAMLを使用してこれを検討しましたか?それは少し遅いかもしれませんが、それはあなたのために重要でしょうか? –

+0

問題を明確にすることはできますか?あなたが示した結果では、RubyとPythonは同じ値を生成していますが、バイトを別々に表示しているだけです。 Rubyは11を '\ v'として表示します。これは"垂直タブ "文字ですが、Pythonは16進数の値である' \ 0x0b'を表示します。同様に、この範囲には、それぞれ '\ n'、' \ f'、 '\ r'として表示される「行送り」(0x0a)、「書式送り」(0x0c)、および「復帰」(0x0d) Pythonは16進値で表示されますが、実際のバイトは同じです。 – matt

+0

右 コードを慎重に再調査した結果、エラー:ソケットにメッセージを出力するputs-output-lineをコメントするのを忘れていました。それは明らかにapiによって容認されなかった。 – hartmut

答えて

0

両方のコマンドが同じように見えます。 エラーはデバッグミスによって発生しました。