热情软件屋

 

在VB中用二进制方式打开文件中的数据读到string型变量中为什么会出错


编号:QA003869
建立日期: 2001年2月12日 最后修改日期:2002年3月1日
所属类别:

zmz:
    我在vb中用二进制方式打开.exe 和.bmp文件中的数据读到string型变量中。然后再已put语句写入另一个新文件中。可是总只发现和原来的文件不一样了。
    我的程序是:
     dim fileno as inter
     dim filelen as long
     dim strX as string
     fileno =freefile
     '读出数据
     open "c:\a.bmp" for binary as fileno
     filelen=LOF(fileno)
     strX=Space$(filelen)
     Get #文件号, , strX
     close fileno
     '写入数据
     open "c:\b.bmp" for binary as fileno
     put #fileno, , strX
     close fileno
    结果原文件和新文件的大小完全一样,可是新的bmp文件就是打不开了。用此方法读.exe文件和bmp文件一样。都和原来的文件不一样了。请高手帮帮我啊!!!!!!

回答:

    在VB中一定要记住,不能使用String变量处理二进制数据。早期的VB是采用单字节处理方式(通常也称为ANSI方式),也就说一个英文字母用一个字节表示,一个汉字算两个字节,当然这样就可能出现半个汉字的问题。从VB 4.0起,VB采用了一种新的处理方式,即内部采用Unicode方式,即不论英文字母还是汉字,一律用两个字节表示,但Unicode还不够普及,所以VB只是在其内部完全使用Unicode,而在外部仍转换为人们习惯的ANSI方式,但在字符串处理上与先前的版本有所不同。例如:在中文Windows或英文Windows外挂RichWin 97中,Len("电子&电脑")=5(这里的&号为半角字符),而在以前的版本或纯英文Windows中Len("电子&电脑")=9。除了Len、Left、Right等字符串函数受此影响外,所有字符操作都受此影响。如果你把二进制数据读入字符串变量,在读入的过程中会发生转换错误,这样你再写入文件数据也就不对了。以上的讨论对于中文等双字节系统都是适用的,但英文版下没有这个问题。所以,你在网上看到的许多程序因为都是美国人写的,他们根本就不考虑这个问题,使用字符串来处理二进制数据,但这样的程序在中文系统中肯定出错。解决的办法是使用Byte数组来处理二进制数据,这样就不会有你说的问题了。例如:
     Dim n As Long
     Dim arrBytes() As Byte
    
     Open "c:\win98\setup.bmp" For Binary As 1
     n = LOF(1)
     ReDim arrBytes(1 To n) As Byte
     Get 1, , arrBytes
     Close 1
    
     If arrBytes(1) = Asc("B") And arrBytes(2) = Asc("M") Then
     MsgBox "这是一个位图文件。"
     End If
    
    类似的,由双字节引起的问题还有:
    QA000388 "MSComm无法在中文Windows 95下传递二进制数据"
    QA002682 "RegQueryValueEx函数返回二进制值到字符串出错"
    QA003729 "利用Winsock控件下载ZIP文件,为什么下载后的文件大小不一致"
    QA001156 "VB中的sp2,sp3,企业版这三种各代表什么含义"
    QA002941 "VB6 好像不认识 ACCSEE 2000 的数据库"

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio