首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

内存结构复制到type类型中,出了点奇怪的有关问题

2012-01-19 
内存结构复制到type类型中,出了点奇怪的问题我将内存中一段数据MemoryCopy到下面的一个type类型中时BCBEBD

内存结构复制到type类型中,出了点奇怪的问题
我将内存中一段数据MemoryCopy到下面的一个type类型中时
BC   BE   BD   DA   00   00   00   00   00   6C   01   6F   11   6E   01   67   11   6A   11   00   63   02   00   00   61   32   32   32   32   32  

00   0E   0D   00   00   02   35   44   15   03   77   2F   01   BE   4F   FF   FF   D4   C0   B7   C9   00   00   00   00   00   00   00   00   00  

00   00   00   00   01   10   01   00   01   00   00   00   00  
变成了:
BC   BE   BD   DA   00   00   00   00   00   01   6F   11   6E   01   67   11   6A   11   00   63   02   00   00   61   32   32   32   32   32   00  

0E   0D   00   00   02   35   44   15   03   77   2F   01   BE   4F   FF   FF   D4   C0   B7   C9   00   00   00   00   00   00   00   00   00   00  

00   00   00   01   10   01   00   01   00   00   00   00   00
用ReadPrcocessMemory也一样,奇怪
6C不见了,后面多了个00

Public   Type   DEMO_STRUCT
                lpName   As   String   *9
                A1   As   Integer
                A2   As   Integer
                A3   As   Integer
                A4   As   Integer
                A5   As   Integer
                Reserved1(5)   As   Byte
                B1   As   Byte
                B2   As   Byte
                B3   As   Byte
                B4   As   Byte
                B5   As   Byte
                Reserved2(4)   As   Byte
                C1   As   Byte
                C2   As   Byte
                C3   As   Byte
              Reserved3(33)   As   Byte
End   Type
Public   ds   As   DEMO_STRUCT
结构有问题吗?改成lpName   As   String   *8或*7都没用;
6C出来了但是调用3个都有问题,ds.A1=&H6F01   或ds.A1=&H6C00
也就是偏移了1Byte,我们要得到的是ds.A1=&H016C.
但是象下面一样改成Byte没问题:
Public   Type   DEMO_STRUCT
                lpName   As   String   *9
                A1(1   To   2)   As   Byte
                A2(1   To   2)   As   Byte
                A3(1   To   2)   As   Byte


                A4(1   To   2)   As   Byte
                A5(1   To   2)   As   Byte
                Reserved1(5)   As   Byte
                B1   As   Byte
                B2   As   Byte
                B3   As   Byte
                B4   As   Byte
                B5   As   Byte
                Reserved2(4)   As   Byte
                C1   As   Byte
                C2   As   Byte
                C3   As   Byte
              Reserved3(33)   As   Byte
End   Type
这样只是分别得到了A1的高低2个字节,多不方便啊,为什么不能一下安全的得到他的Int值或Long值
而不发生偏移,这在VC里没问题,VB里不知怎么做?

[解决办法]
在VB里必须限定长度
[解决办法]
MemoryCopy这些API好像是针对Byte型数据来的。
[解决办法]
字节不对齐的 问题

参考之前的 CopyMemory 文章
[解决办法]
哎!这个问题以前就碰到过,现在都有些忘了。印像中是VB在内存中保存结构时,在一些元素间会加入衬垫,估计是为了便于CPU处理吧。看看MSDN上的说明:
=================================
自定义类型不能以使用值方式传递。Visual Basic 将传递第一个成员的地址,在内存中其它成员存储在第一个的后面。在有的操作系统上,成员之间可能存在空隙。
=================================

这种空隙一般发生在单数字节成员,后面跟着双数字节成员时,String *9是单数字节,Integer或Long等都是双数字节,遇到前面是单数字节成员,VB会在两者之间补上一个 "00 "字节,若改成String *8,VB就又不补空隙了,所以还是错位。

在不能更改结构中各成员的长度情况下,解决办法就是按成员长度使用Byte数组,因为Byte数组长度不管是单还是双,都不会加上衬垫。

还有一种方案是写入文件,VB会自动帮你修正对齐,但建议不要这样做,效率太低。

热点排行