如何将二进制 Byte() 数组转换为 十六进制 String 类型?

RayLynn 2006-01-17 05:47:37
我在传送文件时,因为架构的关系只能使用字符串传输数据。有没有一种办法将 Byte() 数组转换为 String 类型??
...全文
1238 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
topsearch 2006-02-01
  • 打赏
  • 举报
回复
这个正是我这几天所要找的。感谢!
vbfunner 2006-02-01
  • 打赏
  • 举报
回复
很好的东西,吐两字。留个记号
Surpass 2006-01-23
  • 打赏
  • 举报
回复
直接传递Byte数组不就行了吗?效率高,而且方便。
为什么非转成字符串呢?
zyl910 2006-01-22
  • 打赏
  • 举报
回复
HTTP、FTP等(TCP/IP协议组中的)应用层协议,其实正确的叫法是表示层协议
表示层协议是这样一种协议,规定传递的数据代表什么信息,使接收方能正确识别信息
zyl910 2006-01-22
  • 打赏
  • 举报
回复
//winsock1.getdata bytedata,vbArray+vbByte如果按这样接收包,该怎样判断属于哪个协议的?

协议是你自己定的,只有你自己最清楚

以前是用String接收数据的,所以可以用字符串函数方便的对数据进行操作

现在换成Byte数组,没有字符串函数,所以你自己写处理函数
jadeluo 2006-01-22
  • 打赏
  • 举报
回复
1. 传送数据的是TCP或者UDP协议,它们是TCP/IP协议簇中n多个协议中的两个。

2. 按照TCP或者UDP协议能够发送、接收数据。这些数据的格式(也是通讯协议),是你自己定义的。 你可以按照某种标准的通讯协议来定义它,比如FTP协议、HTTP协议、……。

3. winsock1.getdata bytedata,vbArray+vbByte 如果按这样接收包,该怎样判断属于哪个协议的?
根据第2点,这个问题的答案只有楼主最清楚。
RayLynn 2006-01-22
  • 打赏
  • 举报
回复
winsock1.getdata bytedata,vbArray+vbByte

如果按这样接收包,该怎样判断属于哪个协议的?
zyl910 2006-01-22
  • 打赏
  • 举报
回复
直接二进制协议效率是最高的,唯一麻烦的是很多人不习惯操作Byte数组

转为十六进制字符串不仅加大了传输量,而且增加了转化处理的开销
RayLynn 2006-01-22
  • 打赏
  • 举报
回复
感觉速度很慢,做大文件传输时可能不太适合``
有没有用其他语言写的象C++做的COM,让VB来调用``
jadeluo 2006-01-22
  • 打赏
  • 举报
回复
这个误差是由创建文件时产生的,比原来的多了16个字节,原因不明。

下面的代码是有过修改的:

Private Sub cmdStart_Click()
Const SourceFile = "D:\Test1.jpg" '源路径
Const TargetFile = "D:\Test2.jpg" '存储路径
Dim strHex As String

ReDim Data(FileLen(SourceFile) - 1) As Byte '这一行修改过
Debug.Print UBound(Data)
Open SourceFile For Binary Access Read As #1
Get #1, , Data
Close #1

strHex = BinArrayToHex2(Data)

Dim Test() As Byte
Test = HexToBinArray(strHex)
Debug.Print UBound(Test)
Open TargetFile For Binary Access Write As #2
Put #2, , Test
Close #2

MsgBox SourceFile & " 的大小为" & FileLen(SourceFile) / 1024 & " KB" & vbCrLf & _
TargetFile & " 的大小为" & FileLen(TargetFile) / 1024 & " KB"
End Sub

运行后,你会看到数据在两个函数转换前后是一样大的。
RayLynn 2006-01-22
  • 打赏
  • 举报
回复
我再把我的代码帖出来。这里执行后弹出对话框,显示文件大小不同。

Private Function BinArrayToHex2(Bin() As Byte) As String
Dim iLoop As Long
Dim sResult As String
sResult = Space((UBound(Bin) - LBound(Bin) + 1) * 2)
For iLoop = LBound(Bin) To UBound(Bin)
Mid(sResult, (iLoop - LBound(Bin)) * 2 + 1) = Right("0" & Hex(Bin(iLoop)), 2)
Next iLoop
BinArrayToHex2 = Trim(sResult)
End Function

Private Function HexToBinArray(sHex As String) As Variant
Dim iLoop As Long
Dim bResult() As Byte
ReDim bResult(Len(sHex) \ 2 - 1)
For iLoop = 0 To Len(sHex) \ 2 - 1
bResult(iLoop) = Val("&H" & Mid(sHex, iLoop * 2 + 1, 2))
Next iLoop
HexToBinArray = bResult
End Function

Private Sub cmdStart_Click()
Const SourceFile = "D:\test1.jpg" '源路径
Const TargetFile = "D:\test2.jpg" '存储路径
Dim strHex As String

ReDim Data(FileLen(SourceFile)) As Byte
Open SourceFile For Binary Access Read As #1
Get #1, , Data
Close #1

strHex = BinArrayToHex2(Data)
Debug.Print strHex

Open TargetFile For Binary Access Write As #2
Put #2, , HexToBinArray(strHex)
Close #2

MsgBox SourceFile & " 的大小为" & FileLen(SourceFile) / 1024 & " KB" & vbCrLf & _
TargetFile & " 的大小为" & FileLen(TargetFile) / 1024 & " KB"

End Sub
RayLynn 2006-01-22
  • 打赏
  • 举报
回复
你最后给出的代码没带空格的吧?

Private Function BinArrayToHex2(Bin() As Byte) As String
Dim iLoop As Long
Dim sResult As String
sResult = Space((UBound(Bin) - LBound(Bin) + 1) * 2)
For iLoop = LBound(Bin) To UBound(Bin)
Mid(sResult, (iLoop - LBound(Bin)) * 2 + 1) = Right("0" & Hex(Bin(iLoop)), 2)
Next iLoop
BinArrayToHex2 = Trim(sResult)
End Function
RayLynn 2006-01-22
  • 打赏
  • 举报
回复
我的QQ:630843
可以加我一下吗`?谢谢`
jadeluo 2006-01-22
  • 打赏
  • 举报
回复
我测试过你的代码,没有问题啊
jadeluo 2006-01-22
  • 打赏
  • 举报
回复
感觉很慢的原因主要是由于VB的字符串处理比较慢。

sResult = sResult & Right("0" & Hex(Bin(iLoop)), 2)

这个语句每次都会分配新空间,然后复制原数据并完成连接,速度奇慢无比。

下面的这个函数会比原来的快n倍:

Private Function BinArrayToHex2(Bin() As Byte) As String
Dim iLoop As Long
Dim sResult As String
sResult = Space((UBound(Bin) - LBound(Bin) + 1) * 2)
For iLoop = LBound(Bin) To UBound(Bin)
Mid(sResult, (iLoop - LBound(Bin)) * 2 + 1) = Right("0" & Hex(Bin(iLoop)), 2)
Next iLoop
BinArrayToHex2 = Trim(sResult)
End Function
RayLynn 2006-01-22
  • 打赏
  • 举报
回复
你难道可以吗?我帖出全部的代码吧~
你把文件名替换下试试``
?:)

Private Function BinArrayToHex(Bin() As Byte) As String '从二进制到十六进制函数
Dim iLoop As Long
Dim sResult As String
sResult = Empty
For iLoop = LBound(Bin) To UBound(Bin)
sResult = sResult + Right("0" & Hex(Bin(iLoop)), 2) & " "
Next iLoop
BinArrayToHex = Trim(sResult)
End Function

Private Function HexToBinArray(sHex As String) As Variant
Dim iLoop As Long
Dim bResult() As Byte
ReDim bResult(Len(sHex) \ 3)
For iLoop = 0 To Len(sHex) \ 3
bResult(iLoop) = Val("&H" & Mid(sHex, iLoop * 3 + 1, 2))
Next iLoop
HexToBinArray = bResult
End Function

Private Sub cmdStart_Click()
Const SourceFile = "D:\test1.jpg" '源路径
Const TargetFile = "D:\test2.jpg" '存储路径
Dim strHex As String
' Dim Data(256) As Byte

ReDim Data(FileLen(SourceFile)) As Byte
Open SourceFile For Binary As #1
Get #1, , Data
Close #1

strHex = BinArrayToHex(Data)
Debug.Print strHex

Open TargetFile For Binary As #2
Put #2, , HexToBinArray(strHex)
Close #2
End Sub

jadeluo 2006-01-22
  • 打赏
  • 举报
回复
另外,这两个函数不适合处理很大量的数据,你会感觉很慢的。

其实,目前的代码最多处理不超过32KB的数据,因为iLoop是定义成了Integer类型,你可以将其修改成Long。
jadeluo 2006-01-22
  • 打赏
  • 举报
回复
你BinArrayToHex函数有没有去掉中间分隔的空格?

Private Function BinArrayToHex(Bin() As Byte) As String
Dim iLoop As Integer
Dim sResult As String
sResult = ""
For iLoop = LBound(Bin) To UBound(Bin)
sResult = sResult + Right("0" & Hex(Bin(iLoop)), 2)
Next iLoop
BinArrayToHex = Trim(sResult)
End Function
RayLynn 2006-01-22
  • 打赏
  • 举报
回复
兄弟,我用了一张图片测试了一下你的函数,似乎不行呀``
图片通过复制后就不能查看了。以下是我的代码。您帮我看看``:)

Private Sub cmdStart_Click()
Const SourceFile = "D:\Test1.jpg" '源路径
Const TargetFile = "D:\Test2.jpg" '存储路径
Dim strHex As String
Dim Data() As Byte

ReDim Data(FileLen(SourceFile)) As Byte
Open SourceFile For Binary As #1
Get #1, , Data
Close #1

strHex = BinArrayToHex(Data)
Debug.Print strHex

Open TargetFile For Binary As #2
Put #2, , HexToBinArray(strHex)
Close #2
End Sub
jadeluo 2006-01-22
  • 打赏
  • 举报
回复
Private Function HexToBinArray(sHex As String) As Variant
Dim iLoop As Integer
Dim bResult() As Byte
ReDim bResult(Len(sHex) \ 2 - 1)
For iLoop = 0 To Len(sHex) \ 2 - 1
bResult(iLoop) = Val("&H" & Mid(sHex, iLoop * 2 + 1, 2))
Next iLoop
HexToBinArray = bResult
End Function

加载更多回复(13)

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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