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:
parent
aa56530279
commit
124c2c3b60
52
TLV_utils.py
52
TLV_utils.py
|
@ -283,12 +283,12 @@ def tlv_unpack(data):
|
||||||
if length < 0x80:
|
if length < 0x80:
|
||||||
data = data[1:]
|
data = data[1:]
|
||||||
elif length & 0x80 == 0x80:
|
elif length & 0x80 == 0x80:
|
||||||
length_ = 0
|
length_ = 0
|
||||||
data = data[1:]
|
data = data[1:]
|
||||||
for i in range(0,length & 0x7F):
|
for i in range(0,length & 0x7F):
|
||||||
length_ = length_ * 256 + ord(data[0])
|
length_ = length_ * 256 + ord(data[0])
|
||||||
data = data[1:]
|
data = data[1:]
|
||||||
length = length_
|
length = length_
|
||||||
|
|
||||||
value = data[:length]
|
value = data[:length]
|
||||||
rest = data[length:]
|
rest = data[length:]
|
||||||
|
@ -370,6 +370,38 @@ def unpack(data, with_marks = None, offset = 0):
|
||||||
|
|
||||||
return result
|
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__":
|
if __name__ == "__main__":
|
||||||
test = binascii.unhexlify("".join(("6f 2b 83 02 2f 00 81 02 01 00 82 03 05 41 26 85" \
|
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" \
|
+"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())
|
#print decode(file("c100").read())
|
||||||
|
|
||||||
marks = [ ('[', 5, 8) ]
|
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)
|
||||||
|
|
Loading…
Reference in New Issue