将文件作为字节读取并存储到确定性的8位值数组中

时间:2014-09-20 02:29:12

标签: c++ arrays file-io bytearray

在大学毕业几年之后回过头来玩C ++,在查看如何在C ++中读取文件作为字节时,我遇到的一些信息是没有任何类型的魔法" readAsBytes"函数,你本质上应该通过读取文件的方式与文本文件相同,但确保将结果存储到char*。例如:

someIFStream.read(someCharPointer, sizeOfSomeCharPointer);

话虽这么说,即使C ++中的chars通常被认为是8位左右,但这并不能完全保证。开始搞乱不同的平台和文本编码,如果你想要一个真正的字节数组,你就会遇到问题。

您可以使用uint8_t*并复制char*的所有内容。 。 。但是,这真是太浪费了。为什么我们不能在第一时间将所有内容都放入uint8_t*,而我们仍然在阅读文件,而不必担心它是否会导致; 32位机器或64位机器或UTF-8或UTF-16或你有什么?

所以问题是:这是否可行,至少在更现代的C ++版本中?如果是这样,怎么样?我不希望从char*转到uint8_t*的原因基本上就是不必在一些50,000次迭代for循环上浪费大量CPU周期。谢谢!

修改

除非有人强烈建议,否则我将此字节的字节定义为8位。我的理解是字节最初为6位,然后变为7,然后最终确定为8,但是32位分组通常被认为是小字节集合。如果我弄错了,或者我应该以不同的方式考虑这个问题(无论哪种方式),请提出来。

1 个答案:

答案 0 :(得分:2)

char是一个字节,文件是一个字节序列。机器是32位还是64位还是别的什么都没关系,文本是以UTF-8还是UTF-16或其他方式存储并不重要。文件包含字节,每个字节都适合char。这是标准所要求的。

可以改变的是特定平台上的字节中有多少位。如果是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字符作为单一价值。