[英]Reading binary data from file in Python and passing it to a C++ function
[英]alternative reading binary in python instead of C++
我有一個二進制文件和 C++ 代碼,可以像跟隨一樣讀取該二進制文件。
int NumberOfWord;
FILE *f = fopen("../data/vec.bin", "rb");
fscanf(f, "%d", &NumberOfWord);
cout << NumberOfWord< <endl;
這個輸出是:
114042
我想在python中重新實現上面的代碼。
with open("../data/vec.bin","rb") as f:
b = f.read(8)
print struct.unpack("d",b)[0]
但此代碼不起作用。 我的輸出是:
8.45476330511e-53
我的問題是:
1) 為什么整數在 C++ 中有 8 個字節。
我從來不知道 %d 意味着雙倍。 但是,實際上該變量具有整數類型,但通常我們在 C++ 中使用“%d”輸出。 真奇怪。
2)如何在python中提取實數
我想在python代碼中提取一個像上面C++代碼一樣的實數。 那我怎么辦??
也許,我誤解了 python 中的 struct 模塊。
由於您已經能夠使用此 C++(或者更確切地說是 C)行正確讀取文件, fscanf(f, "%d", &NumberOfWord);
,我假設您的文件包含 114042 的文本表示。因此它包含字節
0x31 0x31 0x34 0x30 0x34 0x32 ...
或'1', '1', '4', '0', '4', '2', ...
當您在文本編輯器中打開它時,您可以看到一行114042
。
現在,當您嘗試使用i
格式讀取 if 為二進制文件時,您使用文件的第 4 個字節並實際獲得int('31313034', 16)
: 825308208。我無法重現您使用d
格式獲得的內容以將其解碼為翻倍,因為我猜不出最后一位數字后你的文件里有什么......
如果數字單獨出現在第一行,這很容易:只需讀取一行並將其轉換為 int:
with open("../data/vec.bin","rb") as f:
print int(f.readline())
如果最后一位數字后還有其他字符,則必須首先使用正則表達式(不要忘記導入re
)來獲取數值,然后將其轉換為 int:
with open("../data/vec.bin","rb") as f:
line = f.readline()
m = re.match(t'\s*\d*', line)
print(int(m.group(0)))
TL/DR:不要試圖讀取文本文件,就好像它包含二進制表示一樣
在 C 格式字符串中, %d
是十進制的縮寫。
在 Python 中, d
是 double 的縮寫。
如果它是一個整數,你應該在struct.unpack
調用中使用i
。
with open("../data/vec.bin","rb") as f:
b = f.read()
print struct.unpack("i",b)[0]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.