gpt4 book ai didi

c++ - 为什么以及如何读写二进制文件?

转载 作者:太空狗 更新时间:2023-10-29 19:59:14 27 4
gpt4 key购买 nike

我将游戏项目编码为业余爱好,目前我需要将一些资源数据(例如.BMP)存储为自己的文件格式,以便我的游戏可以解析所有内容并将其加载到屏幕。

为了读取BMP,我读取了 header ,然后读取了每个像素的RGB数据,并且我有一个存储这些值的array [width] [height]。

有人告诉我应该将这些类型的数据保存为二进制格式,而不是原因。我已经了解了二进制及其含义(数据的0-1表示),但是为什么我要使用它来保存.BMP数据呢?
如果我打算稍后在游戏中阅读它,它是否只会增加复杂性,甚至可能减慢加载过程?

最后,如果最好用二进制文件保存(我猜是这样,因为从我对其他游戏资源文件的研究来看,每个人似乎都是这样做的),如何用C++读写二进制文件?
我已经看到了很多问题,但是对于许多不同类型的变量有很多不同的方式,所以我想问哪种是最好的/更多的C++方式?

最佳答案

一切都倒退了。计算机处理器以二进制级别的数据进行操作。计算机中的所有内容都是二进制的。为了以人类可读的形式处理数据,我们编写了跳过循环的函数,以使二进制数据看起来像人类可以理解的东西。因此,如果将.BMP数据作为文本存储在文件中,则实际上是在使计算机做更多的工作,以将.BMP数据从其自然二进制格式转换为文本,然后从其文本格式转换回二进制。为了显示它。

事实是,您可以处理原始二进制格式的数据越多,代码运行速度就越快。较少的转换意味着更快的代码。但是显然存在一个折衷方案:如果您需要能够查看数据并理解数据而又不会拉出魔术解码器环,那么您可能希望将其作为文本存储在文件中。但是在这样做时,我们必须理解,必须进行转换处理才能使人类可读的文本对处理器有意义,正如我所说,该处理器只对纯二进制数据起作用。

并且,以防万一您已经知道了或进行了某种了解,而您的问题是“为什么我应该以二进制模式而不是文本模式打开.bmp文件”,那么原因是打开一个文本模式下的文件要求平台根据平台的需要执行平台从CRLF到LF的转换(“\r\n”到“\n”的转换),以便在内部字符串处理级别上,所有您要处理的是'\n'个字符。如果文件包含二进制数据,则您不希望进行这种转换,否则它将在读取文件时损坏文件中的数据。在这种状态下,大多数数据都可以正常工作,并且大多数情况下都可以正常工作,但是偶尔您会遇到一对十六进制格式为0x0d,0x0a(十进制13,10)的字节,这些字节将被转换仅为0x0a(10),您将在读取的数据中丢失一个字节。因此,请务必以二进制模式打开二进制文件!

好的,根据您的最新评论(如下),是这样的:

如您(现在?)所了解的那样,计算机中的数据以二进制格式存储。是的,这意味着它在0和1之间。但是,在编程时,您实际上不必自己摆弄0和1,除非出于某种原因要进行按位逻辑运算。类型的变量,例如int,是单个位的集合,每个位可以是0或1。它也是字节的集合,并假设一个字节中有8位,那么通常int中的2、4或8个字节,具体取决于您的平台和编译器选项。但是,您可以将该int作为int而不是单独的0和1使用。如果您以最纯粹的形式将int写出到文件中,则字节(以及位)将以未经转换的原始形式写出。但是您也可以将它们转换为ASCII文本并以这种方式将其写出。如果要在屏幕上显示int,则当然不希望看到单个0和1,因此您以ASCII形式(通常将其解码为十进制数字)进行打印。您可以轻松地以十六进制格式打印相同的int,即使数字相同,结果也会看起来有所不同。例如,在十进制中,您可能具有十进制值65。在十六进制中,相同的值是0x41(如果我们知道它在基数16中,则为41)。如果我们以ASCII形式显示它,则该值就是字母'A'(并且仅考虑2、4,或8字节int的低字节,即将其视为char)。

在本讨论的其余部分中,请不要忘记我们在谈论int,而现在在考虑正在讨论char或1字节(8位)。假设我们仍然具有相同的值,即65或0x41或'A',但是您要查看它。如果要将该值发送到文件,则可以将其以原始格式发送,也可以将其转换为文本格式。如果以原始格式发送,它将在文件中占用8位(一个字节)。但是,如果要以文本形式将其写入文件,则可以将其转换为ASCII,这取决于要写入的格式和实际值(本例中为65),它将占用1、2 ,或3个字节。假设您要以无填充字符的十进制ASCII格式编写它。然后,值65将占用2个字节:一个为“6”字节,一个为“5”字节。如果要以十六进制格式打印它,它仍将占用2个字节:一个为'4',一个为'1',除非您在它前面加上“0x”,在这种情况下,它将占4个字节,一个表示“0”,表示“x”,表示“4”,表示“1”。或假设char的值为255(char的最大值):如果我们以十进制ASCII形式将其写入文件,则它将占用3个字节。但是,如果我们以十六进制ASCII形式写入相同的值,则它仍将占用2个字节(如果我们以“0x”开头,则为4个字节),因为十六进制的255值为0xFF。将此与以原始二进制格式写入8位字节(char)进行比较:char占用1个字节(按定义),因此无论其值是多少,它将仅以二进制形式消耗文件的1个字节。

关于c++ - 为什么以及如何读写二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14650259/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com