牛骨文教育服务平台(让学习变的简单)
博文笔记

VB读取超过2G的数据文件

创建时间:2015-07-17 投稿人: 浏览次数:148

VB读取超过2G的数据文件

VB中,在一些函数、数据类型中与win32api调用时很多都是Long数据类型。

Long数据类型的内存空间范围从-2^31到2^31-1(即:-2147483648到2147483647),超过后计算机会转化Long内存空间,显示出(如:-121321333)这样的数值,正常情况下很难理解这个数值是什么。再就是如何传入超出后的数值给win32api。

测试(如:-121321333)传给超出的api数据类型发现计算机是可以识别的。

解决方法:

数据类型转给api:

"计算Long超过范围后指定数值
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Command1_Click()
    Dim FileLen As Currency "储存大于32位文件长度
    Dim FileSize As Long "转换long
    
    "假设在2G数据后面增加长度,大小为1
    FileLen = (2 ^ 31-1)+1 "( 即:2147483648 ) 超过了long长度
    
    FileLen = FileLen / 10000 "Currency数据类型内存对齐
    CopyMemory FileSize, FileLen, 8 "Currency在内存中占8个字节
    
End Sub

"结果

" FileSize值显示结果为-2147483648

api转给数据类型:

    "直接使用Currency数据类型
    Currency = <超过Long的api的数据类型>


在VB中,Currency数据类型可容纳64位数据并最匹配数据内存,可以用来操作64位数据。


至于(如:-121321333)为什么会识别,应该是计算机将数值转化成二进制如:

Long数据类型2^32 -1中:(二进制:)111  1111  1111  1111  1111  1111  1111  1111

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

如果数据增加1后,溢出的结果 -2147483648。(二进制:)1000 0000 0000 0000 0000 0000 0000 0000

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

计算机中用补码来运算加减法,用补码计算-2147483647-1和2147483647+1

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。