I ran into a problem and was hoping to get some suggestions. I am working with a binary file from a software called Cloud Compare. The binary file has the contents described here, https://www.cloudcompare.org/doc/wiki/i ... ?title=SBF. The goal is to read in this file; correctly display the content onto the terminal; and then write the content onto a new file thus creating a duplicate. However, the issue is that the content displayed on the terminal is not correct ( ex. point count (NP) does not give the correct number ). I have tried reading in the contents of the input binary file in two ways.
Method 1:
// Read Header Data, takes up 64 bytes
char* dbfbuff = new char[2];
unsigned long long int np;
unsigned short int ns;
std::vector<double> xyz_shift; xyz_shift.resize(3);
char* unused_buffer = new char[28];
readFile.read(dbfbuff, 2);
std::cout << dbfbuff << std::endl;
std::cout << "After reading in header flag: " << readFile.tellg() << " bytes" << std::endl;
readFile.read((char*) &np, sizeof(unsigned long long int));
std::cout << "NP: " << np << std::endl;
std::cout << "After reading in NP: " << readFile.tellg() << " bytes" << std::endl;
Method 2:
std::stringstream ss;
ss << readFile.rdbuf();
long readSize = 0;
uint16_t dbfbuff;
uint64_t t2;
size_t np;
uint16_t ns;
ss >> dbfbuff;
readSize += sizeof(uint16_t);
std::cout << dbfbuff << std::endl;
std::cout << "After reading in header flag: " << readSize << " bytes" << std::endl;
ss >> t2;
np = static_cast<size_t>(t2);
readSize += sizeof(uint64_t);
std::cout << t2 << std::endl;
std::cout << "After reading in NP: " << readSize << " bytes" << std::endl;
An example of the issue Is that for method 1, the output for point count (NP) is a very very large positive number whereas for method 2 the output is a very small positive number, but the actual value should be in the millions. Do you have any suggestions for reading in the data from the binary file? Thank you for your time!
Cheers,
Daniel Mendez
Reading in cloud compare sbf binary files using C++, does not give me the expected output
Re: Reading in cloud compare sbf binary files using C++, does not give me the expected output
Have you looked at the code in CloudCompare? (https://github.com/CloudCompare/CloudCo ... Filter.cpp). That's definitely the source of truth for how the SBF format is organized.The wiki may be wrong?!
And otherwise, a classical issue is with the big endian / little endian representation (it depends on which platform you are running your own tool).
And otherwise, a classical issue is with the big endian / little endian representation (it depends on which platform you are running your own tool).
-
- Posts: 187
- Joined: Tue Mar 05, 2019 3:59 pm
Re: Reading in cloud compare sbf binary files using C++, does not give me the expected output
The wiki is correct, I verified both the code and a file I saved locally with a hex editor. Without knowledge of the readFile class your using I suspect the issue is somewhere in this region. If you post what your using I can probably help debug.
Re: Reading in cloud compare sbf binary files using C++, does not give me the expected output
daniel wrote: ↑Thu Jun 18, 2020 1:39 pm Have you looked at the code in CloudCompare? (https://github.com/CloudCompare/CloudCo ... Filter.cpp). That's definitely the source of truth for how the SBF format is organized.The wiki may be wrong?!
And otherwise, a classical issue is with the big endian / little endian representation (it depends on which platform you are running your own tool).
Thank you for the suggestions! I am currently looking into the endian representation on my machine.
Re: Reading in cloud compare sbf binary files using C++, does not give me the expected output
Thank you for the update! I am using the C++ std library. Here is the link:WargodHernandez wrote: ↑Thu Jun 18, 2020 5:13 pm The wiki is correct, I verified both the code and a file I saved locally with a hex editor. Without knowledge of the readFile class your using I suspect the issue is somewhere in this region. If you post what your using I can probably help debug.
http://www.cplusplus.com/reference/istr ... ream/read/
Thanks!
-
- Posts: 187
- Joined: Tue Mar 05, 2019 3:59 pm
Re: Reading in cloud compare sbf binary files using C++, does not give me the expected output
Code: Select all
// read a file into memory
#include <iostream> // std::cout
#include <fstream> // std::ifstream
#include <vector>
int main() {
std::ifstream readFile("C:\\Users\\af836c\\Desktop\\ME_Sensor_11_scanCONTROL29xx_100_NORMAL.sbf.data", std::ifstream::binary);
char* dbfbuff = new char[2];
unsigned long long int np;
unsigned short int ns;
std::vector<double> xyz_shift; xyz_shift.resize(3);
char* unused_buffer = new char[28];
readFile.read(dbfbuff, 2);
std::cout << (int)dbfbuff[0] << (int)dbfbuff[1] << std::endl;
std::cout << "After reading in header flag: " << readFile.tellg() << " bytes" << std::endl;
readFile.read((char*)&np, sizeof(unsigned long long int));
std::cout << "NP: " << np << std::endl;
std::cout << "After reading in NP: " << readFile.tellg() << " bytes" << std::endl;
readFile.close();
return 0;
}
Code: Select all
4242
After reading in header flag: 2 bytes
NP: 1494655216077766656
After reading in NP: 10 bytes
C:\Users\af836c\source\repos\SBFTest\x64\Debug\SBFTest.exe (process 19436) exited with code 0.
Press any key to close this window . . .
Just making sure you are loading the .sbf.data file and not the .sbf file correct?
Otherwise it is the endian issue, if you are on an ARM device this would definitely be an issue
Re: Reading in cloud compare sbf binary files using C++, does not give me the expected output
That looks right to me and yes I was using the .sbf.data file. I definitely have an Endian issue and am currently trying to go from little endian to big endian. Any recommendations for doing so?WargodHernandez wrote: ↑Thu Jun 18, 2020 9:34 pm 4242
After reading in header flag: 2 bytes
NP: 1494655216077766656
After reading in NP: 10 bytes
C:\Users\af836c\source\repos\SBFTest\x64\Debug\SBFTest.exe (process 19436) exited with code 0.
Press any key to close this window . . .[/code]
That is the correct output for this file.
Just making sure you are loading the .sbf.data file and not the .sbf file correct?
Otherwise it is the endian issue, if you are on an ARM device this would definitely be an issue