我有一個二進制文件和信息存儲格式的文檔。我試圖用C++編寫一個簡單的程序,它從文件中提取特定的信息,但我錯過了一些東西,因爲輸出不是我所期望的。基於二進制格式文檔訪問特定的二進制信息
文檔如下:
Half-word Field Name Type Units Range Precision 10 Block Divider INT*2 N/A -1 N/A 11-12 Latitude INT*4 Degrees -90 to +90 0.001
有該文件中的其他項目明顯,但這種情況下,我只是想獲得的緯度值。
我的代碼是:
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
char* dataFileLocation = "testfile.bin";
ifstream dataFile(dataFileLocation, ios::in | ios::binary);
if(dataFile.is_open())
{
char* buffer = new char[32768];
dataFile.seekg(10, ios::beg);
dataFile.read(buffer, 4);
dataFile.close();
cout << "value is << (int)(buffer[0] & 255);
}
}
其結果是「值是226」,這是不在允許的範圍內。
我很新的這一點,這裏就是我的意圖,其中寫上面的代碼時:以二進制方式
- 打開文件從文件開始尋求到第11字節的
- 從此讀入4個字節
- 關閉文件
- 將這4個字節輸出爲整數。
如果有人能指出我要出錯的地方,我一定會很感激。我不太瞭解(緩衝區[0] & 255)部分(從某些示例代碼中獲得),因此非常感謝非專業人士的條款。第一100個字節的
進制轉儲:
testfile.bin 98,402 bytes 11/16/2011 9:01:52
-0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F
00000000- 00 5F 3B BF 00 00 C4 17 00 00 00 E2 2E E0 00 00 [._;.............]
00000001- 00 03 FF FF 00 00 94 70 FF FE 81 30 00 00 00 5F [.......p...0..._]
00000002- 00 02 00 00 00 00 00 00 3B BF 00 00 C4 17 3B BF [........;.....;.]
00000003- 00 00 C4 17 00 00 00 00 00 00 00 00 80 02 00 00 [................]
00000004- 00 05 00 0A 00 0F 00 14 00 19 00 1E 00 23 00 28 [.............#.(]
00000005- 00 2D 00 32 00 37 00 3C 00 41 00 46 00 00 00 00 [.-.2.7.<.A.F....]
00000006- 00 00 00 00 [.... ]
什麼是半字?什麼是int * 2,什麼是int * 4?偏移是基於零還是基於一個。另外:請添加(部分)一個hexdump到OQ。 – wildplasser
@wildplasser:我的猜測是我們正在計算2個字節的單位,'int * k'的意思是「k字節的整數」... –
這留下了從零開始的索引(以16位爲單位?)。順便說一句:IIRC汽車發動機控制工作在16位數量。但第二個想法:我不認爲他們存儲Lattitude ;-) – wildplasser