2017-10-07 2 views
-1

後にこれが私のコードです:削除「 - 」バイナリ操作

with open("bin.bin", "rb") as file: 
    content=file.read() 
    binary = bin(int(binascii.hexlify(content), 16)) 
    binary = ' '.join('{0:08b}'.format(ord(x)-128, 'b') for x in content) 
    print binary 

私の出力の形式は次のとおりです。

私は取り除くことができますどのように
01100111 -1001001 00011110 

「 - 」とでそれを置き換えます0?

+1

おそらく '(ord(x)+ 128)%256'が必要でしょうか?しかし、なぜこのようなものが欲しいのかは、汚いです。 – o11c

答えて

2

あなたが実際にビットを取得しようと右(だけではなく、値を中央にしようと)している場合は、あなたが異なるが必要戦略。 -1001001は、実際には-73です。

def convert_num(num, bits=8): 
    if num >= 0: 
     return num 
    mask = (1 << bits) - 1 
    return ((-1 * num)^0xFF) + 1 

binary = ' '.join('{0:08b}'.format(convert_num(ord(x)-128), 'b') for x in content) 

をただし、あなたが読んでいるデータが署名されることを意図されている場合、その後:8ビット量については、このの2の補数のバージョンは、実際には以下の何をするかである--wh​​ich 10110111だろうあなたは、データを変換するためにstruct.unpack()を使用することができます。

binary =' '.join('{0:08b}'.format(struct.unpack('b', x)[0], 'b') for x in content) 

それとも、代わりにこれを使用することができます:

def to_signed_char(x): 
    if x >= 128: 
     return x - 256 
    return x 

binary = ' '.join('{0:08b}'.format(to_signed_char(x), 'b') for x in content) 

それは本当にあなたが阿智しようとしているかに依存しますここにイブ。

0

私の悪い、ただ答えを見つけ、追加したABS()

binary =' '.join('{0:08b}'.format(abs(ord(x)-128), 'b') for x in content) 
+2

あなたはその表現でバイナリで同じ数量を表現していないことに気づいていますか? – jszakmeister

+0

どういう意味ですか? – amintou

+1

つまり、-73を「01001001」として73と同じであることを意味します.2の補数バージョン(符号付き文字)は「10110111」になります。 – jszakmeister

関連する問題