请教如何实现比特级内存拷贝,位域及其他方法探讨

JinxLeader 2015-12-05 11:44:06
楼主现在的需求是有共1000byte的数据存储在USORT数组中。现在需要按照协议进行数据拆分。按协议内容,每个实际意义数据占的比特数从1bit~32bit不等。
想请教各位有什么高效的方法实现这个需求?

楼主现在想到的方法是定义带有位域的结构体,使用memcpy().将数组数据拷贝到结构体中。但是现在的问题是结构体没有实现位对齐,导致拷贝出现了内存空洞。采用#pragma pack(push,1),没有效果,请问应该如何解决?
我使用的是VS2005,WinCE6.
...全文
1280 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
smile_ethan 2017-10-12
  • 打赏
  • 举报
回复
没有有效的方法,只能用位运算做bitcopy算法。我现在也在研究这个,因为要做图像复制,而图像的每个点都是bit,不可能要求图像复制时必须8像素对齐,只能用位运算写bitcopy算法。而且涉及到源和目标的字节内offset不一定相同,所以算法还挺复杂
  • 打赏
  • 举报
回复
引用 16 楼 JinxLeader 的回复:
请问使用汇编语言可以实现bit级的内存拷贝吗?如果可以,请问应该如何着手?
计算机最小操作单位为字节。 看你提问,估计你也不会汇编。还是想想自己是不是把问题想复杂了。
  • 打赏
  • 举报
回复
写一个函数 DWORD GetBit(VOID * ptrArray, DWORD indexOfBit, DWORD bitCount);
JinxLeader 2016-01-09
  • 打赏
  • 举报
回复
请问使用汇编语言可以实现bit级的内存拷贝吗?如果可以,请问应该如何着手?
falloutmx 2015-12-10
  • 打赏
  • 举报
回复
你要修改的是你的结构体,保证结构体的bit总数等于1000byte
worldy 2015-12-10
  • 打赏
  • 举报
回复
元数据生成 struct A { ...... //包含位域的数据结构 } A a[Num]; //A的数组 //数组写入内容 //保存到一个文件或保存到EPROM,保存后就是a的原始形态 数据读出和使用 //从文件或者EPROM中,读出数据到字节数组 char b[]中(一般使用指针,然后申请内容,这样可以动态调整b的大小) //定义一个 struct A* pA; pA=(A*)b; 到此,pA就和原始的a等效,根本不需要什么内存拷贝
worldy 2015-12-10
  • 打赏
  • 举报
回复
元数据生成 struct A { ...... //包含位域的数据结构 } A a[Num]; //A的数组 //数组写入内容 //保存到一个文件或保存到EPROM,保存后就是a的原始形态 数据读出和使用 //从文件或者EPROM中,读出数据到字节数组 char b[]中(一般使用指针,然后申请内容,这样可以动态调整b的大小) //定义一个 struct A* pA; pA=(A*)b; 到此,pA就和原始的a等效,根本不需要什么内存拷贝
JinxLeader 2015-12-10
  • 打赏
  • 举报
回复
引用 11 楼 worldy 的回复:
元数据生成 struct A { ...... //包含位域的数据结构 } A a[Num]; //A的数组 //数组写入内容 //保存到一个文件或保存到EPROM,保存后就是a的原始形态 数据读出和使用 //从文件或者EPROM中,读出数据到字节数组 char b[]中(一般使用指针,然后申请内容,这样可以动态调整b的大小) //定义一个 struct A* pA; pA=(A*)b; 到此,pA就和原始的a等效,根本不需要什么内存拷贝
你好,我的原始数据是保存在ushort usArray[500]数组里,也就是1000bytes的原始数据。想要请教的是有什么高效的方法可以将其拆分到struct A结构体里,以供后续使用。
thinkers 2015-12-10
  • 打赏
  • 举报
回复
1000个数据,不如自己写个转换函数循环执行。 写一个1000成员的结构太麻烦了。
91program 2015-12-09
  • 打赏
  • 举报
回复
引用 9 楼 JinxLeader 的回复:
这里想请教大家有没有什么巧妙的方法,可以将数组数据拆成bit量级的数据。
你的想法是好的,想法是没有问题。
JinxLeader 2015-12-09
  • 打赏
  • 举报
回复
引用 8楼91program 的回复:
这种问题,其实是没有什么可探讨的。 自己动手,实际看一看 memcpy 的执行效果即可确定 LZ 你的想法是否可行? 已知方法很简单,大家如果有其它未知的方法可以提供当然更好!!!但是没有未知方法前,上述讨论的已知方法,分分钟钟就可以得到结论。如果 LZ 的想法不可行,也没有其它方法,你打算如何做? 答案当然是自己按 bit 的位数对数据进行解析。
你好,我就是觉得按bit 位解数据这种方法太笨拙了。 这里想请教大家有没有什么巧妙的方法,可以将数组数据拆成bit量级的数据。
91program 2015-12-09
  • 打赏
  • 举报
回复
这种问题,其实是没有什么可探讨的。 自己动手,实际看一看 memcpy 的执行效果即可确定 LZ 你的想法是否可行? 已知方法很简单,大家如果有其它未知的方法可以提供当然更好!!!但是没有未知方法前,上述讨论的已知方法,分分钟钟就可以得到结论。如果 LZ 的想法不可行,也没有其它方法,你打算如何做? 答案当然是自己按 bit 的位数对数据进行解析。
  • 打赏
  • 举报
回复
你先搞清楚原始数据格式。不然就不要说pack(push,1)无效
  • 打赏
  • 举报
回复
逗,memcpy怎么拷贝半个字节的。肯定是整数字节。 你要搞清楚这个原始数据这个1000个字节通过什么方式得来,数据原来怎么排。 比如网络或者串口什么的。发送方把结构体填充好了,直接发过来,那么你就可以用对应的结构体的指针指向数组的地址,进行分析。关键是要知道数据具体怎么排。不知道你说不上。协议的东西你一点都没题,所以你只能自己分析。 好的协议一般会有协议头什么的,然后一个头你就知道后面是什么数据,然后就可以进行下一步分析。就像TCP/IP协议栈一样。 如果你的数据过来后没有任何识别你怎么知道“每个实际意义数据占的比特数从1bit~32bit”具体是多少呢?
JinxLeader 2015-12-08
  • 打赏
  • 举报
回复
引用 5 楼 accessysq 的回复:
你先搞清楚原始数据格式。不然就不要说pack(push,1)无效
原始数据是1000byte 的 ushort数组。数组里的都是有效数据。需要将这些数据拆分成从1bit到32bit不等的数据段。 关于pack(1)是我理解错了,1指的是字节而不是比特,所以我这么设置,在使用memcpy拷贝到不是整数字节的数据会出现内存空洞。 我现在想请教大家的是如何将一个数组的数据高效的拆分成比特级别的数据结构。
  • 打赏
  • 举报
回复
#pragma pack(push,1)为啥没效果,是你接收到的数据对齐方式不一致?
alien75 2015-12-07
  • 打赏
  • 举报
回复
你的数据处理涉及到网络传送吗?如果有就要考虑lsb和msb、big-endian和little-endian等差异引起的数据错误。
JinxLeader 2015-12-07
  • 打赏
  • 举报
回复
引用 2楼这个家伙很懒1 的回复:
#pragma pack(push,1)为啥没效果,是你接收到的数据对齐方式不一致?
接收的数据需要按照类似如下格式进行解帧。 struct: a:1; b:2; c:15; 等不定。 将接收到数组memcpy 到设置的结构体。会有内容丢失。 怀疑是内存对齐导致的内存空洞。但pack(push,1)无效。会不会是项目属性设置有错误?
JinxLeader 2015-12-06
  • 打赏
  • 举报
回复
问题可以简化成,如何使存储空间按照1bit对齐

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧