BxByteArray.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import struct
  2. # 默认容量
  3. DefaultCapacity = 128
  4. class BxByteArray:
  5. def __init__(self, capacity):
  6. self.list = bytearray(capacity)
  7. self.next = 0
  8. def add(self, data):
  9. if self.next == len(self.list):
  10. # 扩展容量
  11. self.list.extend(bytearray(len(self.list) * 2))
  12. self.list[self.next] = data
  13. self.next += 1
  14. def addInt16(self, data, endian):
  15. # 确保容量足够
  16. if self.next + 1 >= len(self.list):
  17. self.list.extend(bytearray(len(self.list) * 2))
  18. # 打包为2字节
  19. if endian == 0: # LITTLE
  20. packed = struct.pack('<h', data)
  21. else: # BIG
  22. packed = struct.pack('>h', data)
  23. # 复制到列表
  24. self.list[self.next:self.next+2] = packed
  25. self.next += 2
  26. def addInt(self, data, endian):
  27. # 确保容量足够
  28. if self.next + 3 >= len(self.list):
  29. self.list.extend(bytearray(len(self.list) * 2))
  30. # 打包为4字节
  31. if endian == 0: # LITTLE
  32. packed = struct.pack('<i', data)
  33. else: # BIG
  34. packed = struct.pack('>i', data)
  35. # 复制到列表
  36. self.list[self.next:self.next+4] = packed
  37. self.next += 4
  38. def addBytes(self, src):
  39. if src:
  40. # 确保容量足够
  41. if self.next + len(src) - 1 >= len(self.list):
  42. self.list.extend(bytearray(len(self.list) + len(src)))
  43. # 复制数据
  44. self.list[self.next:self.next+len(src)] = src
  45. self.next += len(src)
  46. def addBytesOffsetLength(self, src, offset, length):
  47. if src:
  48. # 确保容量足够
  49. if self.next + length - 1 >= len(self.list):
  50. self.list.extend(bytearray(len(self.list) + length))
  51. # 复制数据
  52. self.list[self.next:self.next+length] = src[offset:offset+length]
  53. self.next += length
  54. def set(self, index, data):
  55. if index < len(self.list):
  56. self.list[index] = data
  57. def get(self, index):
  58. return self.list[index]
  59. def Build(self):
  60. return bytes(self.list[:self.next])
  61. def size(self):
  62. return self.next
  63. def clear(self):
  64. self.next = 0
  65. # 创建BxByteArray实例的函数
  66. def NewBxByteArray(capacity):
  67. return BxByteArray(capacity)
  68. # 创建默认容量的BxByteArray实例的函数
  69. def NewDefaultBxByteArray():
  70. return NewBxByteArray(DefaultCapacity)