2017-03-12 12 views
1

私はstdinの内容を一度に1022バイト読み込もうとしています。このコードは、テキストファイルで正常に動作します。しかし、バイナリファイルを入力するときにUnicodeDecodeErrorが返されます。以下のデータはsys.stdinです。Python3のUnicodeDecodeErrorがバイナリファイルを読み込むときstdin

def sendStdIn(conn, cipher, data): 
    while True: 
     chunk = data.read(1022) 
     if len(chunk)==1022: 
      EOFAndChunk = b'F' + chunk.encode("utf-8") 
      conn.send(encryptAndPad(cipher,EOFAndChunk)) 
     else: 
      EOFAndChunk = b'T' + chunk.encode("utf-8") 
      conn.send(encryptAndPad(cipher,EOFAndChunk)) 
      break 
    return True 

バイナリファイルが、私はその後、私は以下で終わる本質的python A3C.py < 1MB.bin でファイルを実行しdd if=/dev/urandom bs=1K iflag=fullblock count=1K > 1MB.bin

を呼び出すことによって行われました。

Traceback (most recent call last): 
    File "A3C.py", line 163, in <module> 
    main() 
    File "A3C.py", line 121, in main 
    EasyCrypto.sendStdIn(soc, cipher, sys.stdin) 
    File "EasyCrypto.py", line 63, in sendStdIn 
    chunk = data.read(1022) 
    File "/usr/lib64/python3.5/codecs.py", line 321, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 0: invalid continuation byte 

私は一度にサーバ側片に、このクライアント側からそれらを送信する必要があるため、それはバイナリファイルのセクションを読むことができるので、私はこれを行うことができますどのように任意のアイデア。ありがとう!

+0

修正点は、 'sendStdIn'ではなく' main() 'でコード化することです。あなたは完全なトレースバックを含めて良いこと! :-) –

答えて

3

sys.stdinは、バイナリデータをデコードするテキストラッパーです。代わりsys.stdin.bufferを使用する:

EasyCrypto.sendStdIn(soc, cipher, sys.stdin.buffer) 

下のI/Oオブジェクトを緩衝バイナリへTextIOBase.buffer attributeポイント。

+0

ありがとうございました!これは完全に機能しました。それは私を怒らせている。 –

関連する問題