如何把二进制数据(通过VB从文件中读取的)转换成正常的字符串?我急需要解决,请各位大侠帮帮忙,谢谢!

luckychr 2002-02-27 09:40:33
我采用VB以二进制方式读取文件时,出现不能把二进制数据正常转换成字符串(即:转一部分换成了非法字符串,尤其是文件中包含的非英文字符)问题。请各位大侠帮帮忙(最好提供源码),我现在急需要解决这个问题,在此,我再次向你表示感谢。以下是我的一些源码:

Private Sub cmdTest_Click()
Dim b As Byte
Dim fl As Long
Dim sect As Long
Dim ss As Long
Dim index As Long
Dim hNewFile As Long
Dim lSize As Long
Dim intSN As Integer

On Error GoTo Error1

intSN = 0
FileName = Trim(txtCCICFilePath.Text) ' 文件名
Filenum = FreeFile
fl = FileLen(txtCCICFilePath.Text)
sect = fl / 16
ss = fl Mod 16

Open FileName For Binary As #Filenum

If sect = 0 Then
For index = 1 To ss
Get #1, index, b
Next index
End If

lSize = 64
ReDim LoadBytes(1 To lSize ) As Byte
If sect <> 0 Then
For i = 1 To fl Step lSize

Get #Filenum, i, LoadBytes
Text1.Text = Text1.Text + StrConv(LoadBytes, vbUnicode)

Next
End If

Close #Filenum
Exit Sub

Error1:
MsgBox Err.Description
End Sub

'请各位看看我主要错在哪儿,Thanks a lot!
...全文
697 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjhyahoo 2002-03-01
  • 打赏
  • 举报
回复
你要注意啊,如果是汉字(它的二进制第一位是1,英是0),如果是汉字就要两个字节来读
KiteGirl 2002-03-01
  • 打赏
  • 举报
回复
BytesGetByString在我的函数库里是一个低级函数,它不具备容错能力。所以很容易出错误。

ReDim Preserve pBytes(tLoop-1)的错误可以用以下措施预防:

pString 至少要有一个字符
pBytes()必须是动态数组
pBytes()必须至少有一个元素(用ReDim声明为pBytes(0))

下面的方法可以预防这种错误的产生。
Dim tTestStr As String
Dim tTestBytes() As Byte
ReDim tTestBytes(0)
If CBool(Len(tTestStr)) Then
BytesGetByString tTestStr,tTestBytes()
End If

另外你可以在调试状态测试:
1、pBytes()是不是数组
2、pBytes()有几个元素(如果参数数组没用ReDim定义至少有1个元素。那就可能出错了)
3、tLoop的值是否大于0

另外需要说明的是:我提供给你的函数不能把其他格式的字符串的Byte正确转换成字符串。只有把字符串用上面的函数转换成Byte数组保存,才可以用上面的函数转换回来。

  如果你想把一个现成的格式的文件的字符串读取出来那要用Type语句定义和这个文件相似的字段类型才可以。另外需要注意的是VB在保存字段字符串的时候有个Bug,假如你定义一个String * 12的子变量,而实际上这个变量占用24Byte的空间,但是只保存12Byte的信息。后面的12Byte是死区,无法操作。这个Bug体现在写操作上,但不影响读。
  我上面提供的函数就是解决这个问题的一个临时办法。
luckychr 2002-03-01
  • 打赏
  • 举报
回复
谢谢,KiteGirl(小仙妹),我试着运行了你的代码,但StringGetByBytes函数还是不能正常转换中文等字符。而且BytesGetByString函数中的 ReDim Preserve pBytes(tLoop - 1)有错误。请问你能试试,再把问题告诉我好吗?非常感谢!
jett 2002-02-27
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim b(10) As Byte
b(0) = &HE7
b(1) = 0
b(2) = &HE8
b(3) = 0
b(4) = &HE9
b(5) = 0
Text1.Text = Text1.Text & VBA.StrConv(VBA.StrConv(b, vbFromUnicode), vbUnicode)

End Sub
text1中&HE7还是显示不出来
api画是没问题,但不知道怎么让控件也可以显示
playyuer 2002-02-27
  • 打赏
  • 举报
回复
Text1.Text = Text1.Text & VBA.StrConv(VBA.StrConv(LoadBytes, vbFromUnicode), vbUnicode)
jett 2002-02-27
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topic/537/537285.xml
看一下这里,
luckychr 2002-02-27
  • 打赏
  • 举报
回复
Thanks a lot, jamex(亲亲吾爱),非英文字符是指中文,日文等和其它一些特殊字符.我注意了些字符是双字节的,但还是乱麻.
jamex 2002-02-27
  • 打赏
  • 举报
回复
非英文字符是指什么字符?
注意有些字符是双字节的,如果一个一个字节读,势必是乱麻
lou_df 2002-02-27
  • 打赏
  • 举报
回复
转换为16进制。
zyl910 2002-02-27
  • 打赏
  • 举报
回复
读取:
Dim TempFile As Long
Dim LoadBytes() As Byte

TempFile=FreeFile
Open 文件名 For Binary As #TempFile
Redim LoadBytes(1 To Lof(TempFile)) As Byte
Get #TempFile,,LoadBytes
Close TempFile

Text1.Text=StrConv(LoadBytes,vbUniCode)

写入:
Dim TempFile As Long
Dim SaveBytes() As Byte

SaveBytes=StrConv(Text1.Text,vbFromUniCode)

TempFile=FreeFile
Open 文件名 For Binary As #TempFile
Put #TempFile,,SaveBytes
Close TempFile
KiteGirl 2002-02-27
  • 打赏
  • 举报
回复
这个问题有两个办法:
1、从存储到读取上解决。采用UniCode存储就可以了。

2、现行文件以GB2312存储。所有Ascii大于127(扩展码)的都是汉字的半角。而小于128并大于31的都是可以显示的英文字符。对于GB2312的问题,可以采用奇偶累加办法来解决。当第一次遇到扩展码时,开始计算奇偶。遇到偶数则将两个字节完整拼为一个。但问题是VB内以UniCode显示汉字,所以还要做代码转换。

对于一个现成的文件,应当采取定义相似类型的方式读为String。而你自己设计二进制文件则要把字符串自行转换成Byte数组。

以下程序就是专门把字符串转换成Byte数组的程序,兼容中文,而且提供了转换回来的函数。

Function StringGetByBytes(pBytes() As Byte) As String
'StringGetByBytes函数
'语法:tOutString=StringGetByBytes(pBytes())
'功能:从Byte数组获得字符串[兼容中文]
'参数:pBytes() 保存字符串的Byte数组。
'返回:tOutString Byte数组中保存的字符串。
Dim tOutStr As String
Dim tLoop As Integer
Dim tByteLen As Integer

tByteLen = UBound(pBytes)

For tLoop = 0 To tByteLen
tOutStr = tOutStr & ChrB(pBytes(tLoop))
Next

StringGetByBytes = tOutStr
End Function

Function BytesGetByString(ByVal pString As String, pBytes() As Byte) As Integer
'StringGetByBytes函数
'语法:[tOutInt=]BytesGetByString(pString, pBytes())
'功能:将字符串保存到数组[兼容中文]
'参数:pString 被保存的字符串。
' pBytes() 保存字符串的Byte数组。
'返回:tOutString Byte数组的元素数量。
Dim tStrLength As Integer
Dim tLoop As Integer
Dim tCodeStart As Byte

tStrLength = LenB(pString)

For tLoop = 1 To tStrLength
tCodeStart = AscB(MidB(pString, tLoop, 1))
ReDim Preserve pBytes(tLoop - 1)
pBytes(tLoop - 1) = tCodeStart
Next

BytesGetByString = tStrLength
End Function

741

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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