mirror of
https://github.com/licsber/micropython.git
synced 2024-09-20 17:10:24 +08:00
79d5acbd01
Prior to this patch, the size of the buffer given to unpack/unpack_from was checked for being too small by using the count of the arguments, not their actual size. For example, a format spec of '4I' would only check that there was 4 bytes available, not 16; and 'I' would check for 1 byte, not 4. This bug is fixed in this patch by calculating the total size of the format spec at the start of the unpacking function. This function anyway needs to calculate the number of items at the start, so calculating the total size can be done at the same time.
93 lines
2.1 KiB
Python
93 lines
2.1 KiB
Python
try:
|
|
import ustruct as struct
|
|
except:
|
|
try:
|
|
import struct
|
|
except ImportError:
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
print(struct.calcsize("<bI"))
|
|
print(struct.unpack("<bI", b"\x80\0\0\x01\0"))
|
|
print(struct.calcsize(">bI"))
|
|
print(struct.unpack(">bI", b"\x80\0\0\x01\0"))
|
|
|
|
# 32-bit little-endian specific
|
|
#print(struct.unpack("bI", b"\x80\xaa\x55\xaa\0\0\x01\0"))
|
|
|
|
print(struct.pack("<l", 1))
|
|
print(struct.pack(">l", 1))
|
|
print(struct.pack("<i", 1))
|
|
print(struct.pack(">i", 1))
|
|
print(struct.pack("<h", 1))
|
|
print(struct.pack(">h", 1))
|
|
print(struct.pack("<b", 1))
|
|
print(struct.pack(">b", 1))
|
|
|
|
print(struct.pack("<bI", -128, 256))
|
|
print(struct.pack(">bI", -128, 256))
|
|
|
|
print(struct.calcsize("100sI"))
|
|
print(struct.calcsize("97sI"))
|
|
print(struct.unpack("<6sH", b"foo\0\0\0\x12\x34"))
|
|
print(struct.pack("<6sH", b"foo", 10000))
|
|
|
|
s = struct.pack("BHBI", 10, 100, 200, 300)
|
|
v = struct.unpack("BHBI", s)
|
|
print(v == (10, 100, 200, 300))
|
|
|
|
# network byte order
|
|
print(struct.pack('!i', 123))
|
|
|
|
# check that we get an error if the buffer is too small
|
|
try:
|
|
struct.unpack('I', b'\x00\x00\x00')
|
|
except:
|
|
print('struct.error')
|
|
|
|
# first arg must be a string
|
|
try:
|
|
struct.pack(1, 2)
|
|
except TypeError:
|
|
print('TypeError')
|
|
|
|
# make sure that unknown types are detected
|
|
try:
|
|
struct.pack("z", 1)
|
|
except:
|
|
print("Unknown type")
|
|
|
|
# Initially repitition counters were supported only for strings,
|
|
# but later were implemented for all.
|
|
print(struct.unpack("<3B2h", b"foo\x12\x34\xff\xff"))
|
|
print(struct.pack("<3B", 1, 2, 3))
|
|
|
|
# pack_into
|
|
buf = bytearray(b'>>>123<<<')
|
|
struct.pack_into('<bbb', buf, 3, 0x41, 0x42, 0x43)
|
|
print(buf)
|
|
struct.pack_into('<bbb', buf, -6, 0x44, 0x45, 0x46)
|
|
print(buf)
|
|
|
|
try:
|
|
struct.pack_into('<bbb', buf, 7, 0x41, 0x42, 0x43)
|
|
except:
|
|
print('struct.error')
|
|
try:
|
|
struct.pack_into('<bbb', buf, -10, 0x41, 0x42, 0x43)
|
|
except:
|
|
print('struct.error')
|
|
|
|
# unpack_from
|
|
buf = b'0123456789'
|
|
print(struct.unpack_from('<b', buf, 4))
|
|
print(struct.unpack_from('<b', buf, -4))
|
|
try:
|
|
print(struct.unpack_from('<b', buf, 10))
|
|
except:
|
|
print('struct.error')
|
|
try:
|
|
print(struct.unpack_from('<b', buf, -11))
|
|
except:
|
|
print('struct.error')
|