0

Socket オブジェクトを使用してデータを読み取る Ruby アプリに、Telnet 経由で印刷できない ASCII 文字 (コード 128 - 255) を送信しようとしています。

telnet 経由で送信しようとすると\x80、Ruby が 3 バイトの文字列を受信すると予想されます: 128 13 10

私は実際に 6 バイトの文字列を受け取ります: 92 120 56 48 13 10.

telnet が情報を送信する方法や、Ruby ソケットが情報を受け入れる方法を変更する必要はありますか? 理解できるすべての telnet 専門用語を読みました。正しい方向へのポイントは非常に高く評価されます。

4

1 に答える 1

3
92 120 56 48 13 10

10 進数の ASCII です。

\  x   8  0  \r \n

つまり、あなたは非常に間違ったことをしており、それは Telnet ではありません。エスケープ シーケンス\x80は、code=128 の単一文字として理解されるのではなく、文字どおりに処理されました。

'\x80'の代わりに使用したと思います"\x80"。異なる引用符に注意してください。それが単一の文字だった場合、Ruby では character を使用して?文字を表すこともできます?\x80。たとえば、次のようになります。

"\x80\r\n" == ?\x80 + ?\r + ?\n
=> true

もちろん

'\x80\r\n' == "\x80\r\n"
=> false

--

コメントからの長い話を要約するには:

  • もともと送信されるデータは、telnet 端末を介して手動で入力されていました
  • 多くの場合、telnet 端末はエスケープ コードを受け入れず、取得したものすべてを直接「送信する」だけで、特殊文字を含むテキストのコピーと貼り付けが機能することもあれば、端末が特殊文字を送信するための追加の UI グッズを提供することもありますが、今回の端末は非常に基本的で、貼り付けが機能せず、UI グッズもありませんでした
  • データを手動で入力する代わりに、パイプを介してファイルを telnet 端末に送信すると、はるかにうまく機能するように見えました。一部のデータが到着しましたが、良好ではありません
  • telnet端末の代わりに(netcat)にデータをパイプすると、ncほぼ動作するように見え、バイナリデータが到着しましたが、まだ完全ではありませんでした
  • hexdump ユーティリティを使用して入力ファイル (nc にパイプされたファイル) を調べたところ、ファイルには私たちが考えていたものとまったく異なるものが含まれていることが判明しました。余分な不要なバイトが追加されました
  • 最後に、xxd というユーティリティが、調整された 16 進テキストから適切なバイナリ データを生成するのに役立ちました。の出力は(netcat)xxdに直接パイプできますnc
于 2015-01-08T20:57:56.863 に答える