jjzjj

c++ - 从文件中解析二进制数据

提前感谢您的帮助!我正在学习C++。我的第一个项目是为我们在实验室使用的二进制文件格式编写一个解析器。我能够使用“fread”在Matlab中相当轻松地使解析器工作,看起来这可能适用于我在C++中尝试做的事情。但从我读到的内容来看,似乎推荐使用ifstream。我的问题有两个方面。首先,使用ifstream相对于fread的优势到底是什么?其次,如何使用ifstream来解决我的问题?这就是我想要做的。我有一个包含一组结构化整数、float和64位整数的二进制文件。共有8个数据字段,我想将每个字段读入其自己的数组。数据结构如下,重复288字节block:Bytes0-3:intByte

c++ - qDatastream中的Qt二进制读取错误

我正在读取一个由传感器生成的二进制文件。我在读取不同精度(32或64)的float时遇到问题。我可以在MATLAB(64位版本)中阅读它们,但Qt(Windows上的32位版本)给出了错误的值。我可以读到dtmth(请引用下面的结构)。之后,我得到了baseline的值Inf。这个值实际上是0。如您所见,我更改了MSB(LittleEndian)。如果我保留BigEndian,我会得到0作为基线,但其他值是错误的。我的桌面是64位的。我检查了字节数,它们是正确的。我认为问题是机器精度。QDataStreamin(&file);in.setByteOrder(QDataStream::L

c++ - 找出(在 C++ 中)二进制数是否是另一个的前缀

我需要一个带有这样标题的函数:boolis_prefix(inta,intb,int*c){//...}如果a是,读取为二进制数字字符串,b的前缀,然后将*c设置为b的其余部分(即“b比a多”)并返回true。否则,返回假。假设二进制字符串总是以“1”开头。当然-通过逐位比较很容易做到(左移b直到b==a)。但是有没有更有效的解决方案,无需迭代位?示例:a=100(4),b=1001(9)。现在将*c设置为1。 最佳答案 可以用自己喜欢的"fast"methodtofindthehighestsetbit.让我们调用函数msb()。

c++ - 从二进制文件中获取源文件(和位置)列表

我在Linux发行版中工作。我正在编写一个C/C++程序,该程序需要一个二进制(可执行文件)编译时使用的源文件列表。当然,我使用带有-g标志的GCC编译了二进制文件。使用gdb我发现二进制文件的格式是DWARF2:(gdb)infosourceCurrentsourcefileissrc/main.cppCompilationdirectoryis/path/to/sourceLocatedin/path/to/source/src/main.cppContains43lines.Sourcelanguageisc++.CompiledwithDWARF2debuggingformat

c++ - boost::archive::binary_oarchive 如何处理枚举?

我有以下枚举enumExample:uint8_t{First=1,Second=2,};和一个字符串流:std::stringstreamstream;boost::archive::binary_oarchivear(stream);现在我注意到,如果我序列化一个枚举:arboost序列化4字节(在本例中为0x01、0x00、0x00、0x00)位,而不是uint8_t所需的8位(0x01)。有什么办法可以避免这种情况吗?我的意思是,我知道我可以将该枚举转换为uint8_t,但这种接缝不是很巧妙(如果必须这样做,我必须更改很多东西)。谢谢和问候 最佳答案

c++ - 正确使用 CMAKE_*_OUTPUT_DIRECTORY

前言:我只谈论本地编译,不是安装项目。这是因为我还没有对适当的install做足够的研究。使用CMake,如果我的问题直接与install相关,请插话实践(似乎有可能)。长话短说在什么情况下您不希望将所有正在构建的项目库收集到同一目录中?为什么从来没有人CACHECMAKE_*_OUTPUT_DIRECTORY路径?是否需要执行$直接级别规范?一般默认值应该是CMAKE_BINARY_DIR,CMAKE_CURRENT_BINARY_DIR,或PROJECT_BINARY_DIR?1。缓存还是不缓存?来自thisexcellentanswerset(CMAKE_ARCHIVE_OUTP

c++ - 在 C++ 中将二进制数据写入 fstream

问题我有一些结构要写入二进制文件。它们由来自cstdint的整数组成,例如uint64_t.有没有办法将它们写入二进制文件,而不需要我手动将它们拆分为char的数组?并使用fstream.write()函数?我尝试过的我天真的想法是,c++会弄清楚我有一个二进制模式的文件和会将整数写入该二进制文件。所以我尝试了这个:#include#include#includeusingnamespacestd;intmain(){fstreamfile;uint64_tmyuint=0xFFFF;file.open("test.bin",ios::app|ios::binary);file但是,这

c++ - 使用 lower_bound、upper_bound 和 binary_search 查找具有相等成员字段的对象

我有一个看起来像这样的结构,structFoo{inta;};我有一个看起来像这样的结构vector,vectorfoos;所有Foo都使用STLsort()函数按整数a升序排序。现在我想获取成员字段a小于或等于给定数字的Foo对象,就像STLlower_bound()函数一样。问题在于STLlower_bound函数声明如下所示:templateForwardIteratorlower_bound(ForwardIteratorfirst,ForwardIteratorlast,constT&value,Comparecomp);所以当我想做类似的事情时,lower_bound(fo

c++ - 调试读/写字符串到二进制文件

我正在尝试写入一个二进制文件,这是我的代码片段#include#include#includeusingnamespacestd;structuser{stringID;stringpassword;};intmain(){fstreamafile;afile.open("user.dat",ios::out|ios::binary);userperson;person.ID="001";person.password="abc";afile.write(reinterpret_cast(&person),sizeof(person));person.ID="002";person.p

C++ 将长十六进制字符串转换为二进制

我在这里找到了类似的解决方案:MissingpunctuationfromC++hex2bin并使用该答案:std::stringhex2bin(std::stringconst&s){std::stringsOut;sOut.reserve(s.length()/2);std::stringextract;for(std::string::const_iteratorpos=s.begin();pos如示例所示打印:DECODED:Thisisa123test.但对于较长的十六进制字符串似乎效果不佳,例如:printf("DECODED:%s\n",hex2bin("02000000