2016-09-17 7 views
2

Ich habe diese beiden und es scheint, dass Bytes2integer falsch ist, aber ich habe alle anderen Probleme beseitigt. Was ist falsch? p3compat bietet einige Hilfsfunktionen. Nebenbei bemerkt, -int(data[1:], 2) funktioniert auch nicht, aber das ist nicht notwendig für die Richtigkeit. Der Code ist PY2 und PY3.Fehler beim Analysieren von Strings zu Ints

def bits2integer(data, signed=False): 
    data = "".join("01"[b & 1] for b in iterateints(data)) 
    if signed and data[0] == "1": 
     # return -int(data[1:], 2) 
     data = data[1:] 
     bias = 1 << len(data) 
     return int(data, 2) - bias 
    else: 
     return int(data, 2) 


def bytes2integer(data, signed=False): 
    number = 0 
    for b in iterateints(data[::-1]): 
     number = (number << 8) | b 

    if signed and byte2int(bytes2bits(data[0:1])[0:1]): 
     # data = data[1:] 
     bias = 1 << (len(data)*8 -1) 
     return number - bias 
    else: 
     return number 

Tests zurück diese Fehler:

returned 6124614018247163903, expected -300 
returned -9079256848778919937, expected -255 
returned 2089670227099910143, expected -100 
returned 9223372036854775807, expected -1 
returned 72057594037927936, expected 1 
returned 7205759403792793600, expected 100 
returned 18374686479671623680, expected 255 
returned 3170815612645539840, expected 300 

Antwort

0

Bytes falsch umgekehrt wurden, und es analysiert dann das Vorzeichenbit in Nummer. Zwei Bugs behoben.

def onebit2integer(b): 
    if b in (b"0", b"\x00"): 
     return 0 
    if b in (b"1", b"\x01"): 
     return 1 
    raise ValueError(r"bit was not recognized as one of: 0 1 \x00 \x01") 


def bits2integer(data, signed=False): 
    number = 0 
    for b in iteratebytes(data): 
     number = (number << 1) | onebit2integer(b) 

    if signed and onebit2integer(data[0:1]): 
     bias = 1 << (len(data) -1) 
     return number - bias*2 
    else: 
     return number 


def bytes2integer(data, signed=False): 
    number = 0 
    for b in iterateints(data): 
     number = (number << 8) | b 

    if signed and byte2int(bytes2bits(data[0:1])[0:1]): 
     bias = 1 << (len(data)*8 -1) 
     return number - bias*2 
    else: 
     return number 
Verwandte Themen