Я искал здесь и в Google, затем нашел коды, которые позволяют мне писать этот код, который читает двоичный 2-байтный файл НАСА с подписью.
#include <iostream>
#include <fstream>
using namespace std;
const int SRTM_SIZE = 3601;
static int height[SRTM_SIZE][SRTM_SIZE] = {{0},{0}}; //matrix 3601*3601
int main() {
ifstream file("/storage/emulated/0/N52E012.hgt", ios::in | ios::binary);
if(!file) {
cout << "Error opening file!" << endl;
return -1;
}
unsigned char buffer[2];
for (int i = 0; i < SRTM_SIZE; ++i){
for (int j = 0; j < SRTM_SIZE; ++j){
if(!file.read(reinterpret_cast<char*>(buffer), sizeof(buffer))){
cout << "Error reading file!" << endl;
return -1; }
height[i][j] = (buffer[0] << 8) | buffer[1];
}}
// my section
ofstream meinFile;
meinFile.open ("/storage/emulated/0/N52E012.csv");
for(int x = 0; x < SRTM_SIZE; x++){ // from row 1 to row SRTM_Size
for(int y = 0; y < SRTM_SIZE; y++){ // from column 1 to SRTM_Size
int lastCol = SRTM_SIZE-1;
meinFile << height[x][y] << ((y!=lastCol) ? "," : ""); //avoiding "," after last value in each row
}
meinFile << endl;
}
meinFile.close();
cout<< "Converted!" <<endl;
return 0;
}
У меня вопрос, как и где изменить этот код, чтобы он мог читать 2-байтовый двоичный файл без знака вместо 2-байтового двоичного файла со знаком?
Подсказка: этот код отлично читает 2-байтовую подпись NASA Int, но также "unsigned", прежде чем "char buffer [2]" заставляет меня запутаться.
Я все еще новичок в C ++, но я знаю, что 2-байтовый Int (со знаком или без знака) занимает 4 байта, а число с плавающей запятой 8 байтов.
Редактировать Я думаю, что этот код работает должным образом, хотя в двоичном файле нет отрицательных значений, как в моем случае, но я проверил его, на плитку файла НАСА, которая содержит отрицательные значения, например, в Нидерландах это не работает должным образом, это читает -2 как 65534 !!!
Мой вывод, этот код для 2-байтового без знака int вместо 2-байтового со знаком int