4

我现在正在处理 wav 文件,我正在解析它们。我暂时不想使用库。我用 fstream 打开 wav 文件并将所有数据读入向量。现在我想解析 wav 文件头。例如,我想获取第 4 和第 8 个字节之间的文件大小。我想将它分配给一个 integer 。我很容易用 memcpy 完成这个。但因为它是 C++,我不想使用 memcpy。我最终得到的解决方案:

std::vector<unsigned char>::iterator vectorIte = soundFileDataVec.begin();
vawParams.totalfilesize = 0;
//Since it is little endian I used reverse_copy
std::reverse_copy(vectorIte + 4, vectorIte + 7, (unsigned char*)&vawParams.totalfilesize);

我对 (unsigned char*) 转换为整数指针不满意。我怀疑有比我更好的方法。你能告诉我一个更好的方法吗?

4

2 回答 2

6

向量对其元素使用连续的存储位置,可以使用指向其元素的常规指针上的偏移量来访问它们的元素。因此,如果您不想要一个memcpy那么简单的解决方案是:

int header = *reinterpret_cast<const int*>(&soundFileDataVec[4]);

这会读取您四个字节(您可能需要从一种字节序转换为另一种字节序)。

于 2013-07-21T15:38:36.193 回答
2

一旦您进入二进制序列化领域,如果您想要可移植并且您不想使用库,您几乎必须深入了解在编程语言中如何向您呈现类型的抽象层。您必须准确了解它是如何存储在文件中的,并且您必须准确了解如何将其取出并将其转换为您正在编译的平台上的编译器上的类型表示。

在这些限制下,试图避免强制转换可能本质上是错误的。

于 2013-07-21T15:28:35.970 回答