以字节形式读取文件,并将其存储到一个具有确定性的8位值的数组中
Read file as bytes and store into an array of deterministically 8-bit values
大学毕业几年后,当我在C++中查找如何以字节形式读取文件时,我发现没有任何神奇的"readAsBytes"函数,你基本上应该像读取文本文件一样读取文件,但是要确保将结果存储到CCD_ 1中。例如:
someIFStream.read(someCharPointer, sizeOfSomeCharPointer);
也就是说,尽管C++中的chars
通常应该在8位左右,但这并不能完全保证。开始摆弄不同的平台和文本编码足够长的时间,如果你想要一个真正的字节数组,你就会遇到问题。
你可以使用uint8_t*
并从char*
复制所有内容。但是该死,那太浪费了。为什么我们不能在第一次读取文件时将所有内容都放入uint8_t*
中,而不必担心它是32位机器还是64位机器,或者UTF-8或UTF-16,或者你有什么?
所以问题是:至少在更现代的C++版本中,这可能吗?如果是,如何?我不想从char*
到uint8_t*
的原因基本上是不必在50000次迭代的for
循环上浪费大量CPU周期。谢谢
编辑
为了这个问题,我将字节定义为8位,除非有人强烈建议不要这样做。我的理解是,字节最初是6位,后来变成了7位,最后稳定在8位,但32位分组等通常被认为是字节的小集合。如果我错了,或者我应该以不同的方式(无论哪种方式)看待这个问题,请把它提出来。
char
是一个字节,文件是一系列字节。机器是32位还是64位或其他什么并不重要,文本是以UTF-8还是UTF-16或其他什么存储也不重要。一个文件包含字节,每个字节适合一个char*
0。这是标准要求的。
不同的是在特定平台上一个字节中有多少比特。如果是8,则char
与uint8_t
相同(除了有符号性之外,它不会影响数据的存储方式),并且您可以直接将字节读取到uint8_t
中。但是,如果一个字节是,比如说,10位,你就必须在一个循环中强制转换所有的chars
,因为从文件中读取会得到一个10位字节的序列,你需要从每个字节中截取两位。
如果您希望程序能够适应不同的字节大小,可以使用#if CHAR_BIT == 8
来确定是直接读取uint8_t
数组还是读取char
数组,然后将所有字节强制转换为uint8_t
。
由于您正在"回到C++",并且在从文件中读取原始char
数据时担心UTF-8与UTF-16,我猜您已经习惯了Java和C#等语言,其中char
类型表示Unicode字符。在C和C++中情况并非如此。char
是一个字节,如果从文件中读取多字节UTF-8字符,则会将每个字节作为一个单独的char
,而不是将整个Unicode字符作为一个值。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '