我想使用 python 将 int8 numpy 数组转换为字符串,该字符串可以作为我的 C++ 数组的初始化器包含在内,定义如
uint32 arr[]={packed_int8_data, ...}
。请注意,uint32 只是一个数据容器,稍后我想将其拆分为多个 C++ int8 变量。
我编写了这样的Python代码,将4个int8数据打包到一个数据包中,但是当我解码它时,符号丢失了。我对二进制补码表示感到非常困惑,那么问题是什么以及如何解决它?
import numpy as np
def pack_int8_to_uint32(int8_values):
uint32_data = 0
for i, value in enumerate(int8_values):
uint32_data |= (value & 0xFF) << (8 * i)
return uint32_data
int8_values = np.array([-10, -16, 15, 8], dtype=np.int8).tolist()
packed_uint32 = pack_int8_to_uint32(int8_values)
def unpack_uint32_to_int8(uint32_data):
int8_values = []
for i in range(4):
int8_values.append((uint32_data >> (8 * i)) & 0xFF)
return int8_values
unpacked_int8_values = unpack_uint32_to_int8(packed_uint32)
print("Unpacked int8 values:", unpacked_int8_values)
print(hex(packed_uint32))
结果
Unpacked int8 values: [246, 240, 15, 8]
0x80ff0f6
我想将打包的数据打印到字符串中,这样我就可以像这样使用它:
uint32 data = 0x80ff0f6
因为 python 整数具有无限精度,所以它将每个 8 位值视为正整数。您可以使用解包函数的修改版本恢复原始标志:
def unpack_uint32_to_int8(uint32_data):
int8_values = []
for i in range(4):
num = uint32_data >> (8 * i) & 0xFF
if num & 0xF0: # if the sign bit is set
num = ~(num ^ 0xFF) # restore the original signed value
int8_values.append(num)
return int8_values