如何把二进制数据(通过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!
...全文
867 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

软件概述 UG(Unigraphics NX)是一款由西门子(Siemens PLM Software)开发的交互式CAD/CAM/CAE系统。作为全球领先的产品工程解决方案,它集成了产品设计、工程仿真与制造加工于一体。其功能强大且应用广泛,能够轻松实现各种复杂实体和造型的构造,为模具、汽车、航空航天及通用机械等行业提供了高性能的机械设计与制图灵活性。 软件基础信息 • 支持系统: 64位 Windows 10、Windows 11 核心功能模块 一、创新设计:高效、灵活、无缝协同 全链路产品设计 涵盖从2D布局、3D建模、装配设计到图纸文档记录的各个环节,大幅提升设计吞吐量,缩短交付周期超35%。 强大的同步建模技术 打破数据壁垒,可无缝导入并直接修改来自其他CAD系统的几何模型,是跨平台协同设计的理想选择。 复杂装配管理 专为大型复杂产品打造,即使面对成千上万的零件也能从容应对,快速识别并解决数字样机的干涉等问题。 集成设计验证 内置自动验证功能,实时监控设计是否符合公司及行业标准;结合PLM数据可视化合成,辅助工程师做出更明智的决策。 二、综合仿真(Simcenter 3D):精准预测,降低试错成本 极速前后处理 依托先进的几何引擎,将强大的分析命令与几何编辑紧密集成,相比传统有限元工具,可缩短高达70%的仿真建模时间。 全方位结构分析 在同一环境集成线性静力学、动态、疲劳及非线性分析,底层由业界顶尖的NX Nastran解算器提供支持,确保计算的高精度与可靠性。 声学与热管理分析 提供内外声学仿真以优化音质、降低噪音;具备一流的热传导仿真能力,帮助电子产品和工业机械实现最佳热管理方案。 多物理场耦合 简化了结构动力学、热传导、流体流动等复杂物理现象的模拟过程,消除外部数据传输错误,真实还原产品运行工况。 三、智能制造(CAM):打通从计划到车间的数字主线 全面的制造解决方案 提供从工装设计、CAM编程到机床控制器(如Sinumerik)的一体化支持,助力制定更科学的生产决策。 深度集成的PLM环境 借助Teamcenter实现数据和流程的统一管理,避免多数据库冲突,支持重用验证过的加工工艺与刀具库。 车间级互联 通过DNC系统与车间无缝对接,直接将加工数据和刀具清单下发至CNC机床,实现计划与生产的紧密结合。 提质增效 优化NC编程与刀具路径,提升表面精加工水平与零件精度;减少人为错误,显著提高新机床部署成功率及制造资源利用率。 总结 UG NX 2023作为一款集成化的产品工程解决方案,通过其强大的设计、仿真和制造功能,为现代制造业提供了完整的数字化产品开发平台。无论是复杂产品的设计验证,还是精密制造的流程优化,UG NX 2023都能为工程师团队提供高效、可靠的解决方案,助力企业提升产品创新能力和市场竞争力。 适用领域 模具设计、汽车制造、航空航天、通用机械、消费电子等

743

社区成员

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

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