implement pack()

git-svn-id: svn+ssh://localhost/home/henryk/svn/cyberflex-shell/trunk@142 f711b948-2313-0410-aaa9-d29f33439f0b
This commit is contained in:
hploetz 2006-11-23 15:02:23 +00:00
parent aa56530279
commit 124c2c3b60
1 changed files with 44 additions and 8 deletions

View File

@ -283,12 +283,12 @@ def tlv_unpack(data):
if length < 0x80:
data = data[1:]
elif length & 0x80 == 0x80:
length_ = 0
data = data[1:]
for i in range(0,length & 0x7F):
length_ = length_ * 256 + ord(data[0])
data = data[1:]
length = length_
length_ = 0
data = data[1:]
for i in range(0,length & 0x7F):
length_ = length_ * 256 + ord(data[0])
data = data[1:]
length = length_
value = data[:length]
rest = data[length:]
@ -370,6 +370,38 @@ def unpack(data, with_marks = None, offset = 0):
return result
def pack(tlv_data, recalculate_length = False):
result = []
for data in tlv_data:
tag, length, value = data[:3]
if not isinstance(value, str):
value = pack(value, recalculate_length)
if recalculate_length:
length = len(value)
t = ""
while tag > 0:
t = chr( tag & 0xff ) + t
tag = tag >> 8
if length < 0x7F:
l = chr(length)
else:
l = ""
while length > 0:
l = chr( length & 0xff ) + l
length = length >> 8
assert len(l) < 0x7f
l = chr( 0x80 | len(l) ) + l
result.append(t)
result.append(l)
result.append(value)
return "".join(result)
if __name__ == "__main__":
test = binascii.unhexlify("".join(("6f 2b 83 02 2f 00 81 02 01 00 82 03 05 41 26 85" \
+"02 01 00 86 18 60 00 00 00 ff ff b2 00 00 00 ff" \
@ -380,5 +412,9 @@ if __name__ == "__main__":
#print decode(file("c100").read())
marks = [ ('[', 5, 8) ]
print unpack( binascii.a2b_hex( "".join( "80 01 aa b0 03 81 01 bb ".split() ) ), with_marks=marks)
a = binascii.a2b_hex( "".join( "80 01 aa b0 03 81 01 bb ".split() ) )
b = unpack( a, with_marks=marks)
print b
c = pack(b, recalculate_length = True)
print utils.hexdump(a)
print utils.hexdump(c)