如何将多个int8数据打包成一个字符串,作为C++变量的初始化器?

问题描述 投票:0回答:1

我想使用 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 c++ numpy
1个回答
0
投票

因为 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
© www.soinside.com 2019 - 2024. All rights reserved.