2016-11-26 77 views
1

我想print一些0xff字節使用Python 3.5.2管他們到另一個程序。我有一個簡單的C程序,它從stdin讀取並打印在十六進制每個字符:如果我回聲0xff字節和管到我的節目如何在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++])); 
} 

,被顯示字符爲預期的(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 

我的問題:

  • 爲什麼蟒紋0xc30xb3字節而不是0xff
  • 使用Python打印0xff的正確方法是什麼?(我想獲得與echo或Perl相同的結果)?
+0

謝謝'sys.stdout.buffer.write (b「\ xff \ xff \ xff \ xff」)'完美地工作 – Daew

+0

另外:聲明'buffer'爲'unsigned char * buffer'以避免錯誤的前導'ffffff'-s。 – 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