[英]how to convert python float to bytes to be interpreted in C++ programm
我需要构建一个将数据导出为自定义文件格式的python脚本。 然后,该文件由cpp程序读取(我有源代码,但无法编译)。
定制文件格式规格:
我无法将python float导出为字节。 因此崩溃了cpp应用程序而没有任何错误跟踪。 如果我尝试用0填充所有浮点数,则加载效果会很好,但是如果我尝试其他任何操作,它将崩溃。
这就是cpp应用读取浮动信息的方式
double Eds2ImporterFromMemory::read4BytesAsFloat(long offset) const
{
// Read data.
float i = 0;
memcpy(&i, &_data[offset], 4);
return i;
}
我尝试如下导出python float:
def write_float(self, num):
# pack float
self.f.write(struct.pack('<f', float(num)))
也有人这样建议我:
def write_float(self, num):
# unpack as integer the previously pack as float number
float_hex = struct.unpack('<I', struct.pack('<f', num))[0]
self.f.write(float_hex.to_bytes(4, byteorder='little'))
但是它每次都会失败。 如您所见,我不是cpp家伙。 您对我的python脚本为什么不起作用有任何想法。
提前致谢
请原谅我对python非常不好,但是我试图产生您想要的结果,它对我来说很好。
python代码:
import struct
value = 13.37
ba = bytearray(struct.pack("f", value))
for b in ba:
print("%02x" % b)
我想如果您只是希望做到这一点(基本上按该顺序将十六进制表示形式写入文件),那么它将很好地工作。
无论哪种方式,它都会输出
85
eb
55
41
我将其放入无符号字符数组并以与您的C ++代码相同的方式使用memcpy:
unsigned char data[] = {0x85, 0xeb, 0x55, 0x41};
float f;
memcpy(&f, data, sizeof(float));
std::cout << f << std::endl;
std::cin.get();
如您所料,它将输出13.37
。 如果您不能重现正确的结果这样一来,我怀疑是别的地方发生了错误,在这种情况下,这将是有益的,看看如何格式由Python编写的,它是如何通过C ++读取。
另外,请记住,有几种方法可以表示字节数组,例如:
\\x85eb5541
, 0x85, 0xeb, 0x55, 0x41
, 85eb5541
等。 对我来说,很可能您只是没有输出正确的格式,因此“解析器”崩溃了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.