【问题标题】:Copy a specific part of a BYTE buffer to a structure+将 BYTE 缓冲区的特定部分复制到结构中
【发布时间】:2012-07-25 18:10:38
【问题描述】:

我在我的文件加载器中工作,我认为下一次更新更好,而不是继续使用 fread 和 fseek 将洞文件读取到 BYTE 缓冲区,我也是如此,现在我想知道是否没有简单的将此 BYTE 缓冲区的一部分分配给结构的方法。

我已经尝试创建一个与结构相同大小的临时缓冲区,将我需要的所有 BYTE 从原始缓冲区复制到它,并使用 memcpy,但它不能正常工作,我只是收到了很多随机数字(我认为我收到了他们的指示,但我不知道正确)。

感谢您的宝贵时间!

编辑:真实代码

void memread(BYTE from[],int pos, void * to,size_t size) 
{   
    BYTE * temp = new BYTE[sizeof(BYTE)*size];

    for (unsigned int i = 0; i< 1+size; i++)
        temp[i] = from[i+pos];

    memcpy(to,temp,size);

}


... inside the file loader ...


fseek(fl,0,SEEK_END);
const int memory_size = (int)ftell(fl);


BYTE * memory = new BYTE[sizeof(BYTE)*memory_size];
fseek(fl,0,SEEK_SET);

for (int i=1;i<=memory_size;i++)
fread(&memory[i],sizeof(BYTE),1,fl);

fclose(fl);

int memory_pos = 0;

XM::Memory xm;
memset(&xm,0,sizeof(XM::Memory));


memread(memory,1,&xm.Header,sizeof(XM::Header));

【问题讨论】:

  • EDIT 发现错误,错误在memread函数中,现在我已经修复了,抱歉!如果有人感兴趣,我已修复代码!
  • 顺便说一句:这是您尝试阅读的著名的 Fast Tracker XM 格式吗?
  • 抱歉回复晚了,是的,我正在尝试为 XM、MOD 和 IT 格式制作一个完整的 C++ 开源播放器库,Chiptune 长寿命!我想下周准备好了,模式/通道/行加载完成,我需要完成的是样本/乐器加载播放速率并选择使用哪个库播放,我在考虑 WINMM 或 OPENAL,但我没有当然...
  • 不想毁了你的派对,但是Audiere 是一个 LGPL 项目,这样做还有更多:) 还要检查DUMB 开源工具(DUMB 文件解析的来源是@987654323 @.
  • 嗯,越多越好,我实际上打算将它用于演示和介绍,并拥有完美的同步系统,并使其可移植,并且又快又小……哦,我这样做是因为我根本无事可做,哈哈

标签: c++ arrays buffer byte memcpy


【解决方案1】:

首先,您正在逐字节读取文件,这会给您带来不好的性能。接下来,您的memread(您不会释放临时缓冲区!)可以替换为简单的memcpy

fseek(fl, 0, SEEK_END); 
const int memory_size = (int)ftell(fl); 

BYTE* memory = new BYTE[sizeof(BYTE) * memory_size];
fseek(fl, 0, SEEK_SET); 

fread(memory, sizeof(BYTE), memory_size, fl); 

fclose(fl); 

int memory_pos = 0; 

XM::Memory xm;
memset(&xm, 0, sizeof(XM::Memory)); 

memcpy(&xm.Header, memory + memory_pos, sizeof(XM::Header);

永远不要忘记 delete[] 分配的数组,例如 tempmemory

【讨论】:

  • 哦,真的吗?哇,我不敢相信答案这么简单!谢谢我的朋友,还有,我还有一个问题。
  • 在我的结构中,我有一些 WORDS 和 DWORDS,使用 memcpy 它会自动将 BYTES 转换为 WORDS 和 DWORDS?
  • 是的,但您必须注意数据对齐和字节序。你必须告诉你的编译器你希望结构是字节对齐的,否则你会遇到麻烦。如果 f.e.该文件是大端的,而您正在以小端的方式读取它,则必须交换 WORD 或 DWORD 中的所有字节。
  • 如果您使用的是 MS 编译器,您可以使用 pack pragma
  • 感谢您的帮助,现在一切正常,我仍然无法理解 pack pragma,但我会阅读更多相关信息 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多