gpt4 book ai didi

c# - 特定于应用程序的数据以及如何处理它?

转载 作者:行者123 更新时间:2023-11-30 19:32:00 25 4
gpt4 key购买 nike

我很好奇应用程序如何生成自己的数据,这些数据会与应用程序本身一起使用。例如,如果你使用任何类型的 PC 游戏的保存文件或某种生成二进制数据的程序,如 Photoshop 的 PSD 文件或 BitTorrent 应用程序的 .torrent 文件,我假设它们都是特定于相应的应用程序并且作者该应用程序的编程方式是创建此数据的方式。我的第一个问题是:这是真的吗?我 99% 肯定它是二进制数据,因为在 Notepad++ 中打开 PSD 文件或 .torrent 文件时,很容易看出它不是人类可以读取的任何内容...

我的第二个问题是:如果我想制作一个以二进制格式生成自己的数据的应用程序(没有纯文本或任何易于操作的内容),我将如何处理这些数据?我可以模糊地想象生成这些数据并将其以二进制格式保存到文件中的过程,但我真的很纠结于当应用程序再次需要这些数据时我将如何处理这些数据。由于这种类型的数据不是纯文本并且不能被视为字符串或类似的任何东西,应用程序如何创建和处理/解析它们自己的二进制数据(或任何一般的二进制数据)?

我可以清楚地看到,当您打开 PSD 文件时,Photoshop 会打开并显示 PSD 文件包含的任何内容。但是许多应用程序如何处理这些格式呢?我只是没有看到如何解析这个特定数据(或一般的二进制数据)并以编程方式用它做你想做的事。

最佳答案

好吧,作为一个简单的例子,让我们以位图为例。

位图有一个标准的文件结构,由信息头和文件头定义。

在维基百科文章(链接:http://en.wikipedia.org/wiki/BMP_file_format)中,您会看到信息 header 和文件 header 具有明确定义的格式。

其中每一个都按原样以二进制形式写入,并按原样以二进制形式读入。然后,实际的位图图像以二进制形式写出。

在其他应用程序中,应用程序可能会选择执行自定义纯文本格式,在这种情况下,它必须以一致的方式写入或对版本控制提供一些支持,以便您可以在文件中使用更新的功能。

不过请查看序列化,这是一个相当广泛的主题,并且有很多方法可以解决这个问题。

编辑:这是一个代码示例(不是最佳的),用于在位图中读取(或写入,并进行适当的修改):

// Tell visual studio to align on 2-byte boundary
// Necessary so if you write to file, it only writes 14 bytes and not 16.
#pragma pack(2)
struct BMIH
{
short bfType;
long bfSize;
short bfReserved0;
short bfReserved1;
long bOffbits;
};

#pragma pack(8)
struct BMFH
{
long biSize;
long biWidth;
long biHeight;
short biPlanes;
short biBitCount;
long biCompression;
long biImageSize;
long biXPelsPerMeter;
long biYPelsPerMeter;
long biClrUsed;
long biClrImportant;
};



BMIH infoheader;
BMFH fileheader;

std::fstream file(filename.c_str(), std::ios::in | std::ios::binary);

// Read in info and file headers
file.read((char *) &infoheader, sizeof(infoheader));
file.read((char *) &fileheader, sizeof(fileheader));

// Calculate size of image
int size = fileheader.biHeight * fileheader.biWidth;
int bytes = size * fileheader.biBitCount / 8;

// Read in the image to a buffer
unsigned char data = new unsigned char[bytes];
file.read((char *) td.data, bytes);
file.close();

该代码实际上是一种极大的简化,并且完全忽略了各种问题,例如如果文件头或数据损坏、文件不完整等会发生什么。但这只是一个概念证明. #pragmas 实际上是特定于 visual studio 的,用于强制正确对齐标题​​。

当我们将其写到文件中时,我们实际上可能不会说“好吧,现在写出这个整数”。相反,我们想把它写成二进制格式。例如,您可能(但不应该)用来编写它的代码如下所示:

// Assume for arguments sake these data structures came pre-filled
BMFH fileheader;
BMIH infoheader;
unsigned char *data;
int size = fileheader.biHeight * fileheader.biWidth;
int bytes = size * fileheader.biBitCount / 8;

std::fstream file("MyImage.bitmap", std::ios::out | std::ios::binary);

file.write((char *) &infoheader, sizeof(BMIH));
file.write((char *) &fileheader, sizeof(BMFH));
file.write((char *) data, sizeof(unsigned char) * bytes);

关于c# - 特定于应用程序的数据以及如何处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6085963/

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