内存结构复制到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里不知怎么做?
...全文
249 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
awperpvip 2007-04-06
  • 打赏
  • 举报
回复
啊,原来是这样啊,多谢homezj(小吉),还有楼上两位。
(兴尽之余,不免长叹:VB不可大用!)
homezj 2007-04-06
  • 打赏
  • 举报
回复
哎!这个问题以前就碰到过,现在都有些忘了。印像中是VB在内存中保存结构时,在一些元素间会加入衬垫,估计是为了便于CPU处理吧。看看MSDN上的说明:
=================================
自定义类型不能以使用值方式传递。Visual Basic 将传递第一个成员的地址,在内存中其它成员存储在第一个的后面。在有的操作系统上,成员之间可能存在空隙。
=================================

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

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

还有一种方案是写入文件,VB会自动帮你修正对齐,但建议不要这样做,效率太低。
neil_cn 2007-04-05
  • 打赏
  • 举报
回复
A1(1 To 2) As Byte
A2(1 To 2) As Byte

A(1 To 4) As Byte <---- 限定了4个字节
awperpvip 2007-04-05
  • 打赏
  • 举报
回复
又是88888
查了半天有具体点的,有针对性的没?谢谢了
awperpvip 2007-04-05
  • 打赏
  • 举报
回复
awperpvip 2007-04-05
  • 打赏
  • 举报
回复
没人知道吗……?
awperpvip 2007-04-05
  • 打赏
  • 举报
回复
奇怪,这次进来的验证码刚好88888
你说走运不?好象有一次也是,会不会中大奖呢?
回到正题,看有什么进展:
字节不对不齐,对啊,怎么消除影响呢?
参考之前的 CopyMemory 文章
……
sss2002 2007-04-05
  • 打赏
  • 举报
回复
字节不对齐的 问题

参考之前的 CopyMemory 文章
junki 2007-04-05
  • 打赏
  • 举报
回复
MemoryCopy这些API好像是针对Byte型数据来的。
awperpvip 2007-04-05
  • 打赏
  • 举报
回复
to Neil:具体怎么限定啊?
neil_cn 2007-04-05
  • 打赏
  • 举报
回复
在VB里必须限定长度

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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