您的位置:程序门 -> vb -> 基础类



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


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


内存结构复制到type类型中,出了点奇怪的问题[已结贴,结贴人:awperpvip]
发表于:2007-04-05 02:04:47 楼主
我将内存中一段数据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里不知怎么做?
发表于:2007-04-05 02:31:311楼 得分:2
在vb里必须限定长度
发表于:2007-04-05 02:38:282楼 得分:0
to   neil:具体怎么限定啊?
发表于:2007-04-05 07:45:103楼 得分:0
没人知道吗……?
发表于:2007-04-05 08:49:384楼 得分:0
发表于:2007-04-05 11:01:245楼 得分:0
a1(1   to   2)   as   byte
a2(1   to   2)   as   byte

a(1   to   4)   as   byte     <----   限定了4个字节
发表于:2007-04-05 14:59:276楼 得分:4
memorycopy这些api好像是针对byte型数据来的。
发表于:2007-04-05 18:06:147楼 得分:4
字节不对齐的   问题

参考之前的   copymemory   文章
发表于:2007-04-05 18:39:408楼 得分:0
奇怪,这次进来的验证码刚好88888
你说走运不?好象有一次也是,会不会中大奖呢?
回到正题,看有什么进展:
字节不对不齐,对啊,怎么消除影响呢?
参考之前的   copymemory   文章
……
发表于:2007-04-05 21:59:239楼 得分:0
又是88888
查了半天有具体点的,有针对性的没?谢谢了
发表于:2007-04-06 09:31:1110楼 得分:10
哎!这个问题以前就碰到过,现在都有些忘了。印像中是vb在内存中保存结构时,在一些元素间会加入衬垫,估计是为了便于cpu处理吧。看看msdn上的说明:
=================================
自定义类型不能以使用值方式传递。visual   basic   将传递第一个成员的地址,在内存中其它成员存储在第一个的后面。在有的操作系统上,成员之间可能存在空隙。
=================================

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

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

还有一种方案是写入文件,vb会自动帮你修正对齐,但建议不要这样做,效率太低。
发表于:2007-04-06 09:42:0011楼 得分:0
啊,原来是这样啊,多谢homezj(小吉),还有楼上两位。
(兴尽之余,不免长叹:vb不可大用!)


快速检索

最新资讯
热门点击