我目前正在尝试了解更多的文件格式。

我有一个3D文件格式的规格(在这种情况下为U3D),我想尝试实现它。没什么严重的,只是为了学习效果。

我的问题始于需要定义的类型。我必须定义不同的整数(8bit,16bit,32位未签名和签名),然后在将其写入文件之前需要将其转换为十六进制。

如何定义这些类型,因为我不能仅仅创建I16 IE?对我来说,另一个问题是如何将I16转换为具有8位数字(即0001 0001)的十六进制号。

有帮助吗?

解决方案

十六进制只是一个数字的代表。您是否将数字解释为二进制,十进制,十六进制,八分等取决于您。在C ++中,您可以支持小数,十六进制和八分音表现,但它们都以相同的方式存储。

例子:

int x = 0x1;
int y = 1;
assert(x == y);

文件格式可能希望您以普通的二进制格式存储文件。我认为文件格式不希望将十六进制数字作为可读的文本字符串。如果是这样,那么您可以使用std :: hex为您进行转换。 (例子: file << hex << number;)

如果文件格式谈论编写超过1个字节类型要文件,请小心 尼迪亚人 您的架构。这意味着您是否存储了首先或最后一个多字节类型的最重要字节。

在文件格式规格中非常普遍,向您展示二进制文件应如何寻找文件的给定部分。尽管将其实际存储为字符串,但不要将其混淆。同样,他们有时会通过在十六进制中指定它的外观来为此提供快捷方式。同样,大多数情况下,它们实际上并不意味着文本字符串。

C ++中最小的可寻址单元是 char 这是1个字节。如果要在该字节内设置位,则需要使用诸如 &|. 。位于位运算符上有很多教程,因此我不会在这里详细介绍。

其他提示

如果包括 <stdint.h> 您将获得诸如:

uint8_t
int16_t
uint32_t

首先,让我理解。整数以十六进制格式为文件中的文本存储在没有前缀0x的情况下?

然后,使用此语法:

fprintf(fp,“%08x”,编号);

将将0ABC1234写入文件。

至于“定义不同的整数(8bit,16bit,32位未签名和签名)”,除非您自己滚动并为它们滚动数学操作,否则您应该坚持系统提供的类型。有关可用的TypeDef,请参见stdint.h,例如int32_t。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top