Skip to content

Commit

Permalink
[PYTHON-4803] Big endian fix for binary bson vectors (#1885)
Browse files Browse the repository at this point in the history
  • Loading branch information
caseyclements authored Oct 1, 2024
1 parent bfba548 commit 7fbeca9
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions bson/binary.py
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ def from_vector(
raise NotImplementedError("%s not yet supported" % dtype)

metadata = struct.pack("<sB", dtype.value, padding)
data = struct.pack(f"{len(vector)}{format_str}", *vector)
data = struct.pack(f"<{len(vector)}{format_str}", *vector)
return cls(metadata + data, subtype=VECTOR_SUBTYPE)

def as_vector(self) -> BinaryVector:
Expand All @@ -454,7 +454,7 @@ def as_vector(self) -> BinaryVector:

if dtype == BinaryVectorDtype.INT8:
dtype_format = "b"
format_string = f"{n_values}{dtype_format}"
format_string = f"<{n_values}{dtype_format}"
vector = list(struct.unpack_from(format_string, self, position))
return BinaryVector(vector, dtype, padding)

Expand All @@ -465,13 +465,16 @@ def as_vector(self) -> BinaryVector:
raise ValueError(
"Corrupt data. N bytes for a float32 vector must be a multiple of 4."
)
vector = list(struct.unpack_from(f"{n_values}f", self, position))
dtype_format = "f"
format_string = f"<{n_values}{dtype_format}"
vector = list(struct.unpack_from(format_string, self, position))
return BinaryVector(vector, dtype, padding)

elif dtype == BinaryVectorDtype.PACKED_BIT:
# data packed as uint8
dtype_format = "B"
unpacked_uint8s = list(struct.unpack_from(f"{n_values}{dtype_format}", self, position))
format_string = f"<{n_values}{dtype_format}"
unpacked_uint8s = list(struct.unpack_from(format_string, self, position))
return BinaryVector(unpacked_uint8s, dtype, padding)

else:
Expand Down

0 comments on commit 7fbeca9

Please sign in to comment.