2016-11-26 7 views
1

私はprintいくつかの0xffバイトを使用して、Python 3.5.2を使用して別のプログラムにパイプします。私はstdinから読み込み、六角の各文字を出力する簡単なCプログラムを持っている:Pythonで0xffバイトを印刷する方法は?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void main() { 
    char *buffer = malloc(0x100); 
    fgets(buffer, 0x100, stdin); 
    for (int i = 0; buffer[i] != 0; printf("%x ", buffer[i++])); 
} 

私は私のプログラムに0xffバイトとパイプそれをエコーし​​た場合、予想通り、文字が(aが原因改行である)が表示されます。

# echo -e "\xff\xff\xff\xff" | ./print-chars 
ffffffff ffffffff ffffffff ffffffff a 

私もPerlのでそれを行うことができます。

# perl -e 'print "\xff\xff\xff\xff"' | ./print-chars 
ffffffff ffffffff ffffffff ffffffff 

しかし、私はpythonでそれをしようとすると、結果が異なっている:

# python -c 'print("\xff\xff\xff\xff")' | ./print-chars 
ffffffc3 ffffffbf ffffffc3 ffffffbf ffffffc3 ffffffbf ffffffc3 fffffbf a 

私の質問:

  • なぜPythonのプリント0xc30xb3バイトの代わり0xffしていますか?
  • 0xffをPythonで印刷する適切な方法は何ですか(私はechoまたはPerlと同じ結果を得たいですか?)道の
+0

は '、sys.stdout.buffer.writeをありがとう(b "\ xff \ xff \ xff \ xff")は完全に動作します – Daew

+0

脇に:誤った先頭の 'ffffff'-sを避けるために、' unsigned char * buffer'として 'buffer'を宣言します。 – duskwuff

+0

@duskwuff:提案してくれてありがとう、私はPythonの 'print'の出力が何であるかを示すためにこのコードを含めました、それは実際に私が使用するコードではありません – Daew

答えて

-1

つのバイナリ文字列に値をパックするstruct moduleを使用している:

import struct 
value = 0xFF 
s = struct.pack('B', value) 
print(s) 
list_of_values = [255]*4 
s = struct.pack('4B', *list_of_values) 
print(s) 

は、次の出力が得られます:

b'\xff' 
b'\xff\xff\xff\xff' 
+0

... 'print(bytes([255] * 4)) 'の出力と同じです。OPのCプログラムにパイプされると' 62 27 5c 78 66 66 5c 78 66 66 5c 78 66 66 5cになります78 66 66 27 a。 – vaultah

関連する問題