Библиотека BitVector, изменение значения в соединении BitVector - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть следующий код:

from BitVector import BitVector
import struct
import ipaddress

def run_marker_function(marker):
        bv = BitVector(size=16)    # 16 0s
        m(bv, "27.246.2.177", "255.255.255.0")

def m(bv, R, R1):
    # converts ipaddr strings to binary
    bitForm = bin(int(ipaddress.IPv4Address(R)))[2:]
    bitForm1 = bin(int(ipaddress.IPv4Address(R1)))[2:]
    # R2 helper fn is the interleaved output of the 32 bit IP addresses in binary form (R2 is 64 bits)
    R2 = Interleaved(bitForm, bitForm1)
    # splits R2 into list of 8 items, each 8 bits
    frags = [R2[i:i+8] for i in range(0, len(R2), 8)]
    o = 3
    f = frags[o]
    # bv[0:3] = 000 initially, I increment by o
    offset = bv[0:3].int_val() + o
    bv[0:3] = BitVector(intVal=offset, size=3)
    # bv[8:16] = 00000000 initially, I want to replace with the 8 bits of f - DOESN'T WORK
    frag = bv[8:16].int_val() + int(f,2)
    bv[8:16] = BitVector(intVal=frag, size=len(bv[8:16]))

и я получаю следующую ошибку:

 18         frag = bv[8:16].int_val() + int(f,2)
---> 19         bv[8:16] = BitVector(intVal=frag, size=len(bv[8:16]))

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/BitVector/BitVector.py in __init__(self, *args, **kwargs)
else:
   if size < len(bitlist):
       raise ValueError('''The value specified for size must be at least as large as for the smallest bit vector possible for intVal''')

ValueError: The value specified for size must be at least as large as for the smallest bit vector possible for intVal

Но я не понимаю, почему, поскольку я добавляю фактическую длину этого соединения bv. Кроме того, я делаю ту же методологию в

offset = bv[0:3].int_val() + o
bv[0:3] = BitVector(intVal=offset, size=3)

, который не выдает ошибку

EDIT Подобный экземпляр той же ошибки:

dist = bv[3:8].int_val() + 1
bv[3:8] = BitVector(intVal=dist, size=1)

выдает ошибку

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/BitVector/BitVector.py in __setitem__(self, pos, item)
         if ( (pos.stop - pos.start) != len(item) ):
             raise ValueError('incompatible lengths for slice assignment 7')
         for i in range( pos.start, pos.stop ):
             self[i] = item[ i - pos.start ]

ValueError: incompatible lengths for slice assignment 7
...