VB6 Get方法读取二进制到三维字节数组的存储逻辑问询
VB6
Get 读取三维字节数组的内存布局与VB.NET适配方案 核心规则
VB6的Get方法读取多维数组时,完全遵循数组在内存中的存储顺序,而VB6多维数组的存储逻辑是:最左侧的下标变化最快,最右侧的下标变化最慢。
针对你的RawData(200, 200, 1000) As Byte(下标对应x,y,value),文件中的字节顺序对应数组的填充顺序为:
- 先遍历所有
x(1→200),再遍历所有y(1→200),最后遍历value(1→1000) - 对应文件结构:前40000字节是所有
(x,y)位置的第1个读数(value=1),接下来40000字节是所有(x,y)位置的第2个读数(value=2),以此类推,直到第1000组40000字节(value=1000)
这就是你之前猜测“前1000字节对应(1,1)的所有读数”错误的原因——VB6的三维数组并非按单个(x,y)位置的连续读数存储,而是按读数的序号批量存储所有位置的对应值。
VB.NET 适配实现
由于VB.NET的多维数组默认与VB6采用相同的存储顺序(最左侧下标变化最快),你可以通过以下两种方式实现数据读取:
方式1:手动循环填充(直观易理解)
' 声明与VB6一致的1-based三维数组 Dim rawData(1 To 200, 1 To 200, 1 To 1000) As Byte Dim fileBytes As Byte() = File.ReadAllBytes("你的文件路径") Dim offset As Integer = i - 1 ' VB6的Seek从1开始,.NET字节偏移从0开始,需减1 ' 按VB6的存储顺序填充数组 For valueIdx As Integer = 1 To 1000 For yIdx As Integer = 1 To 200 For xIdx As Integer = 1 To 200 rawData(xIdx, yIdx, valueIdx) = fileBytes(offset) offset += 1 Next Next Next
方式2:使用Marshal.Copy批量复制(效率更高)
如果文件较大,批量复制的效率优于循环:
Dim rawData(1 To 200, 1 To 200, 1 To 1000) As Byte Dim fileBytes As Byte() = File.ReadAllBytes("你的文件路径") Dim offset As Integer = i - 1 ' 固定数组到内存,获取指针后批量复制 Dim handle As GCHandle = GCHandle.Alloc(rawData, GCHandleType.Pinned) Try Dim ptr As IntPtr = handle.AddrOfPinnedObject() Marshal.Copy(fileBytes, offset, ptr, rawData.Length) Finally handle.Free() ' 必须释放句柄 End Try
内容的提问来源于stack exchange,提问作者Sheep_Rustler
相关产品推荐
相关产品推荐

