簡體   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