繁体   English   中英

如何将python float转换为要在C ++程序中解释的字节

[英]how to convert python float to bytes to be interpreted in C++ programm

我需要构建一个将数据导出为自定义文件格式的python脚本。 然后,该文件由cpp程序读取(我有源代码,但无法编译)。

定制文件格式规格:

  • 该文件必须为小端。
  • 浮点数必须为4个字节长。

我无法将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 ++读取。

另外,请记住,有几种方法可以表示字节数组,例如:

\\x85eb55410x85, 0xeb, 0x55, 0x4185eb5541等。 对我来说,很可能您只是没有输出正确的格式,因此“解析器”崩溃了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM