65 lines
1.3 KiB
Python
65 lines
1.3 KiB
Python
from typing import Any, BinaryIO
|
|
|
|
from chia.util.struct_stream import StructStream
|
|
|
|
|
|
class int8(StructStream):
|
|
PACK = "!b"
|
|
|
|
|
|
class uint8(StructStream):
|
|
PACK = "!B"
|
|
|
|
|
|
class int16(StructStream):
|
|
PACK = "!h"
|
|
|
|
|
|
class uint16(StructStream):
|
|
PACK = "!H"
|
|
|
|
|
|
class int32(StructStream):
|
|
PACK = "!l"
|
|
|
|
|
|
class uint32(StructStream):
|
|
PACK = "!L"
|
|
|
|
|
|
class int64(StructStream):
|
|
PACK = "!q"
|
|
|
|
|
|
class uint64(StructStream):
|
|
PACK = "!Q"
|
|
|
|
|
|
class uint128(int):
|
|
@classmethod
|
|
def parse(cls, f: BinaryIO) -> Any:
|
|
read_bytes = f.read(16)
|
|
assert len(read_bytes) == 16
|
|
n = int.from_bytes(read_bytes, "big", signed=False)
|
|
assert n <= (2 ** 128) - 1 and n >= 0
|
|
return cls(n)
|
|
|
|
def stream(self, f):
|
|
assert self <= (2 ** 128) - 1 and self >= 0
|
|
f.write(self.to_bytes(16, "big", signed=False))
|
|
|
|
|
|
class int512(int):
|
|
# Uses 65 bytes to fit in the sign bit
|
|
@classmethod
|
|
def parse(cls, f: BinaryIO) -> Any:
|
|
read_bytes = f.read(65)
|
|
assert len(read_bytes) == 65
|
|
n = int.from_bytes(read_bytes, "big", signed=True)
|
|
assert n <= (2 ** 512) - 1 and n >= -(2 ** 512)
|
|
return cls(n)
|
|
|
|
def stream(self, f):
|
|
assert self <= (2 ** 512) - 1 and self >= -(2 ** 512)
|
|
f.write(self.to_bytes(65, "big", signed=True))
|