【发布时间】:2021-08-17 16:35:33
【问题描述】:
我正在读取二进制文件,需要将数据解释为一堆不同的数据类型。 我正在混合使用 numpy 和 ctypes。
我需要做的转换之一是从 4 个 uint16 值到 IEEE 754 双精度值。
我正在像这样组合 uint:
fval = np.uint64((np.int64(uint16_arr[0]) << 48) | (np.int64(uint16_arr[1]) << 32)) | (uint16_arr[2] << 16) | (uint16_arr[3])
并使用我在另一个答案中找到的一些代码将它们转换为双精度:
fval = convert_64(fval)
def convert_64(s): # converts doubles
cp = pointer(c_uint64(s)) # make this into a 64 bit c integer
fp = cast(cp, POINTER(c_double)) # cast the int pointer to a float pointer
return fp.contents.value # dereference the pointer, get the float
# function from here: https://stackoverflow.com/questions/1592158/convert-hex-to-float
这适用于除一组数据之外的所有数据:[C0 84] [84 B6] [B8 F9] [B1 31]
由于某种原因 cast() 为此返回 nan。我已经通过打印确认该值一直到 cp 变量,但由于某种原因 cast() 无法将其传递到 fp 变量。 我需要转换为双精度的所有其他数据都可以很好地通过并得出正确的值。就是这一套给我带来了问题。
任何帮助或建议将不胜感激。
【问题讨论】:
-
您的样本数据的预期结果是什么?
struct.unpack('>d',bytes.fromhex('C0 84 84 B6 B8 F9 B1 31'))[0]->-656.58922,
标签: python numpy casting double ctypes