以字节形式读取文件,并将其存储到一个具有确定性的8位值的数组中

Read file as bytes and store into an array of deterministically 8-bit values

本文关键字:一个 确定性 数组 8位 读取 文件 字节 存储      更新时间:2023-10-16

大学毕业几年后,当我在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,则charuint8_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字符作为一个值。