【问题标题】:How to copy an integer from vector<char>如何从向量复制整数<char>
【发布时间】:2013-07-21 15:13:54
【问题描述】:

我现在正在处理 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*) 强制转换为整数指针不满意。我怀疑有比我更好的方法。你能告诉我一个更好的方法吗?

【问题讨论】:

  • 是否可以改为将 .wav 标头读入结构? (可能使用对齐编译指示?)

标签: c++ stdvector


【解决方案1】:

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

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

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

【讨论】:

  • 我认为你的表格更容易理解。我期待这个案例有一个 std 函数,因为我不喜欢这个演员表。我认为这样的功能不存在。感谢您的回答
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 2020-02-06
    • 1970-01-01
    • 2016-07-10
    • 2019-06-25
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多