在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 的数据库"
此问题由李海回答。
| |
|
|
| |
|
|