请问, 为何Integer在内存中占用4字节? CopyMemory数据出错

heerozh 2004-01-16 09:01:27
很奇怪, 百思不得其解.
代码如下
Public Type BITMAPFILEHEADER
bfType As Integer 'must be 19778 = "BM"
bfSize As Long 'size of file in bytes LOF(%bf)
bfReserved1 As Integer 'Reserved must be set to zero
bfReserved2 As Integer 'Reserved must be set to zero
bfOffBits As Long 'the begining of the actual bmp data
End Type

Private m_bfh As BITMAPFILEHEADER
CopyMemory m_bfh, Stream(0), Len(m_bfh) 'stream是图像的数据流

结果m_bfh.bfReserved2的数据是bfOffBits的.

我看了下m_bfh的内存, 发现如果用Get #1,,m_bfh得到的数据是
42 4D 00 00 36 5A 09 00 00 00 00 00 36 00 00 00 ; BM..6Z......6...
占用了16位也! 当然len得出来是14.
而且m_bfh.bfSize的指针也确实指向36 5A

而从stream CopyMemory 进去的是
42 4D 36 5A 09 00 00 00 00 00 36 00 00 00 ; BM6Z......6...
这才是正确的源图像文件数据啊...

好像只有这个自定义类型有这种问题, 请问发生的原因和解决方法?
先谢了.
...全文
250 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainstormmaster 2004-01-16
  • 打赏
  • 举报
回复
数据对齐的原因,为了处理更快,会把自定义类型大小对齐到 4的整数倍


另外:
//CopyMemory m_bfh, Stream(0), Len(m_bfh) 'stream是图像的数据流
图像的数据流是什么意思?

既然,你定义了:
Private m_bfh As BITMAPFILEHEADER

那么Stream中包含文件头信息吗,Stream又是如何获得的?请详细说明一下。
heerozh 2004-01-16
  • 打赏
  • 举报
回复
学到知识了..
大感激!
只好一个个copy了..
o光o 2004-01-16
  • 打赏
  • 举报
回复
这可以试试 加一个 变量或少一个变量
lk_cool 2004-01-16
  • 打赏
  • 举报
回复
同上
o光o 2004-01-16
  • 打赏
  • 举报
回复
这是因为 数据对齐的原因,为了处理更快,会把自定类型大小对齐到 4的整数倍
heerozh 2004-01-16
  • 打赏
  • 举报
回复
我把试验代码帖出来, 复制一下运行看看...很奇怪....

Option Explicit

Private Type BITMAPFILEHEADER
bfType As Integer 'must be 19778 = "BM"
bfSize As Long 'size of file in bytes LOF(%bf)
bfReserved1 As Integer 'Reserved must be set to zero
bfReserved2 As Integer 'Reserved must be set to zero
bfOffBits As Long 'the space between this struct and the begining of the actual bmp data
End Type

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDst As Any, lpSrc As Any, ByVal Length As Long)

Dim bmfh As BITMAPFILEHEADER

Private Sub Form_Load()
Dim A(13) As Byte

A(0) = 0
A(1) = 1

A(2) = 0
A(3) = 0
A(4) = 0
A(5) = 1

A(6) = 0
A(7) = 1

A(8) = 0
A(9) = 1

A(10) = 0
A(11) = 0
A(12) = 0
A(13) = 1

CopyMemory bmfh, A(0), Len(bmfh)
Debug.Print Hex(VarPtr(bmfh)) '获得指针

Debug.Print bmfh.bfType
Debug.Print bmfh.bfSize
Debug.Print bmfh.bfReserved1
Debug.Print bmfh.bfReserved2
Debug.Print bmfh.bfOffBits

End Sub

我的结果:
1CC14C
256
16777472
256
0
256

heerozh 2004-01-16
  • 打赏
  • 举报
回复
to TechnoFantasy
知道是2字节, 但内存中看下来当中多出了2个字节, 不知道原因....
定义成long不但get数据出错, copy更不对了, 而且还不能显示图像.

to lk_cool
而后面的几个integer类型没有问题.

chenkangli 2004-01-16
  • 打赏
  • 举报
回复
VB中Integer占用的是二个字节,long才是4个字节,byte是一个字节!
lk_cool 2004-01-16
  • 打赏
  • 举报
回复
integer在不同的机器上的长度是不同的。

好像java中integer型在内存中的存放顺序也不同。
TechnoFantasy 2004-01-16
  • 打赏
  • 举报
回复
在VB中Integer占用的是两个字节,你应该定义成Long。
内容概要:本文介绍了如何利用 GitHub Copilot 辅助进行程序调试与 Bug 分析,强调 Copilot 不仅可用于代码生成,更是强大的代码分析与调试工具。文章详细阐述了 Copilot 在调试复杂问题、老旧项目维护和难以复现 Bug 场景下的优势,提出了“先分析、再修改”的四步流程:分析原因→评估风险→提出方案→修改代码,并推荐结合错误日志、用户操作等信息精准提问,提升 AI 回答质量。同时展示了如何通过 Copilot 增强调试能力,如自动加日志、异常保护、生成测试数据和性能分析。最后通过游戏拾取系统的实际案例,说明如何结构化描述问题以获得有效反馈。; 适合人群:具备一定开发经验,正在参与项目调试或维护工作的程序员,尤其是面对复杂逻辑、历史代码或难复现 Bug 的 1-3 年开发者;也适合希望提升 AI 协作能力的技术人员。; 使用场景及目标:①快速定位偶发性崩溃、数据异常等问题根源;②理解无文档或结构混乱的老代码模块;③优化调试流程,借助 AI 生成诊断建议、修复方案与测试用例;④构建更具健壮性的程序,提前发现潜在缺陷。; 阅读建议:学习者应结合自身项目的真实问题,按照文提供的结构化提问模板实践,逐步训练与 Copilot 的协作能力,重视问题描述的完整性与准确性,避免直接要求修改代码,优先通过分析提升对系统的理解。
内容概要:本文针对高精度电流控制下的永磁同步电机(PMSM)参数辨识难题,提出一种基于粒子群优化算法(PSO)的多参数辨识模型,并在Simulink环境完成系统级仿真实现。研究旨在克服传统控制因电机参数(如定子电阻、交直轴电感、永磁磁链等)随温度、负载变化而失配所导致的电流控制性能下降问题。通过构建以电流跟踪误差为核心的适应度函数,利用PSO算法全局寻优能力强的特点,实现对关键电机参数的在线或离线精确辨识。文详述了PSO算法的实现机制、参数初始化策略、收敛判据设计以及与PMSM矢量控制系统的集成方法,验证了该方案在不同运行工况下的辨识精度、收敛速度与鲁棒性,显著提升了电流环的动态响应品质与稳态控制精度。; 适合人群:具备电机驱动控制、现代控制理论及优化算法基础,熟悉MATLAB/Simulink仿真平台,从事高性能PMSM控制系统研发的研究生、高校科研人员及自动化、电力电子领域的工程师;特别适合正在开展参数自适应、智能控制算法应用等相关课题的研究者。; 使用场景及目标:①应用于高端制造装备、电动汽车驱动系统、精密伺服系统等对电流控制精度要求严苛的场合;②解决实际工程因电机温升、老化等因素引发的参数漂移问题,提升系统长期运行稳定性;③作为智能优化算法与电机控制深度融合的教学案例,帮助理解PSO在复杂非线性系统参数辨识的应用逻辑与实现路径。; 阅读建议:建议读者结合提供的Simulink仿真模型进行复现实验,重点剖析PSO算法模块与电机控制模型的接口设计、适应度函数的构建原则及参数敏感性分析方法,可进一步尝试引入其他先进优化算法(如GWO、HHO)进行性能对比,以深入掌握不同智能算法在工程辨识问题的适用性与优劣。

7,787

社区成员

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

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