怎么判断两个byte()数组是相等的呢?

chunaii 2010-02-23 03:18:54
不要一个一个元素的比,数据太长太浪费时间了
...全文
1684 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
神马都能聊 2010-02-25
  • 打赏
  • 举报
回复
呵呵,人有个特点,等待200ms就会有不舒服的感觉,在200ms内有个变化出现会提升友好性。

如果是单一数据就用上面的那些方法吧,如果是批量的比较考虑使用词典好了,词典和MD5的那些加密算法思路类似。
鸭梨山大帝 2010-02-25
  • 打赏
  • 举报
回复
不一定哦,MD5 以及 CRC校验 就不是循环对比数据的.

引用 18 楼 supermanking 的回复:
无论是调用什么样的函数来对比,最终都逃不出循环对比数据的,
只是处理对比的过程哪个比较高而已。
如果用VB程序来循环比较大的数据,效率肯定不会很高,因为VB是
解释性语言,但如果在C语言或效率更高的汇编语言里做,那就完全
不是那么一回事了。
搞惯了高级语言,估计很多人都忘记了,电脑是以二进制为单位计算
的,即使要处理一个字节的内容,也要处理八次,虽然在电子电路上
有多针脚并行通讯,什么8位、16位、32位、64位等,但到了CPU内
部,还是二进制,还是要循环。只是应用层看起来好像是同时而已,
其实只是速度太快,你没感觉罢了,但理论上还是有差别的。
liguicd 2010-02-25
  • 打赏
  • 举报
回复
引用 18 楼 supermanking 的回复:
无论是调用什么样的函数来对比,最终都逃不出循环对比数据的,
只是处理对比的过程哪个比较高而已。
如果用VB程序来循环比较大的数据,效率肯定不会很高,因为VB是
解释性语言,但如果在C语言或效率更高的汇编语言里做,那就完全
不是那么一回事了。
搞惯了高级语言,估计很多人都忘记了,电脑是以二进制为单位计算
的,即使要处理一个字节的内容,也要处理八次,虽然在电子电路上
有多针脚并行通讯,什么8位、16位、32位、64位等,但到了CPU内
部,还是二进制,还是要循环。只是应用层看起来好像是同时而已,
其实只是速度太快,你没感觉罢了,但理论上还是有差别的。

道,源 啊!
现在还是人类 2010-02-25
  • 打赏
  • 举报
回复
还有,不要以为调用什么API或什么语句或函数能够对比就认为没有循环对比数据这个过程,
这个过程是肯定存在的,只是这个过程不是由你来做还是靠别人的函数或语句处理了而已。
现在还是人类 2010-02-25
  • 打赏
  • 举报
回复
引用 20 楼 lost_painting 的回复:
不一定哦,MD5 以及 CRC校验 就不是循环对比数据的.

无论你什么算法,都要有基础,这个基础就是数据,如果你的CRC没有
轮训过所有数据,何来的CRC校验码?无论你MD5再怎么牛X,没有原始
的数据又根据什么来计算?所以循环是肯定的,只是数据重复循环的必
要性而已,用这些编码方式最多只是找出了原始数据的一个特征码而已,
下次如果在需要对比,可以对比特征码,并不是说就不需要了解原始数据,
不需要循环处理数据。
现在还是人类 2010-02-24
  • 打赏
  • 举报
回复
无论是调用什么样的函数来对比,最终都逃不出循环对比数据的,
只是处理对比的过程哪个比较高而已。
如果用VB程序来循环比较大的数据,效率肯定不会很高,因为VB是
解释性语言,但如果在C语言或效率更高的汇编语言里做,那就完全
不是那么一回事了。
搞惯了高级语言,估计很多人都忘记了,电脑是以二进制为单位计算
的,即使要处理一个字节的内容,也要处理八次,虽然在电子电路上
有多针脚并行通讯,什么8位、16位、32位、64位等,但到了CPU内
部,还是二进制,还是要循环。只是应用层看起来好像是同时而已,
其实只是速度太快,你没感觉罢了,但理论上还是有差别的。
鸭梨山大帝 2010-02-24
  • 打赏
  • 举报
回复
呵呵,直接内存溢出,去试试比较两个大小 500MB 的文本字串看看

引用 16 楼 vansoft 的回复:
strconv(byte数组,vbUnicode)

得到BYTE数组的字符串,然后直接=判断就是了。
VBToy 2010-02-24
  • 打赏
  • 举报
回复
如果要比较的数据很长,可以考虑从不同数据段随机抽取部分数据进行对比
vansoft 2010-02-24
  • 打赏
  • 举报
回复
strconv(byte数组,vbUnicode)

得到BYTE数组的字符串,然后直接=判断就是了。
of123 2010-02-24
  • 打赏
  • 举报
回复
引用楼主 chunaii 的回复:
不要一个一个元素的比,数据太长太浪费时间了


无论是 MD5 还是 CRC,都不会比直接比较更快。很明显,将两个数组的每个元素都输入计算,绝不会比对应元素直接比较快。

从楼主“不要一个一个元素的比”的要求,倒产生了一个想法。何不“四个四个的比”?

Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" (Destination As Any, _
Source As Any, ByVal Length As Long)

Private Declare Function timeGetTime Lib _
"winmm.dll" () As Long

Private Function FastCompare(Byval byte_array1() As Byte, Byval byte_array2() As Byte) As Boolean
Dim i As Long
Dim startTime As Long
Dim endTime As Long
Dim bytes As Long
Dim lngArray1() As Long
Dim lngArray2() As Long

bytes = (UBound(byte_array1) - LBound(byte_array1) + 1) * Len(byte_array1(LBound(byte_array1)))

Redim lngArray1(bytes * 4 - 1)
Redim lngArray2(bytes * 4 - 1)
FastCompare = True

startTime = timeGetTime
CopyMemory lngArray1(LBound(lngArray1)), byte_arrar1(LBound(byte_arrar1)), bytes
CopyMemory lngArray2(LBound(lngArray2)), byte_arrar2(LBound(byte_arrar2)), bytes

startTime = timeGetTime
For i = LBound(lngArray1) To UBound(lngArray1)
If lngArray1(i) <> lngArray2(i) Then
FastCompare = False
Exit For
End If
Next i
endTime = timeGetTime
Debug.Print "FastCompare took: " & endTime - startTime & " ms."
End Function

没有时间测试了,请楼主自测。
ttsffgg 2010-02-24
  • 打赏
  • 举报
回复
原来12楼已经有了啊
ttsffgg 2010-02-24
  • 打赏
  • 举报
回复
首先
一个一个元素的比是避免不了的
即使有简洁的语句,其内部还是一个一个对比

另外提出想法
1采取较为合理的采样方式(随机采样,跳跃取样等)
如果两个数组的不同之处实在是没有什么规律,那么可以采取随机采样.而不要逐个对比
如果两个数组的不同之处可能是连成一片,比如连续几个字节出现差别,那么完全可以跳跃取样
总之要根据数据的规律找出最合理的取样方法

2在32位系统中,对比大量的byte实在是很浪费
如果用模拟指针的方法,以long的形式对比,则一次就可以对比4个byte,速度也会大大提高
迈克揉索芙特 2010-02-23
  • 打赏
  • 举报
回复
引用 10 楼 liguicd 的回复:
引用 8 楼 veron_04 的回复:似乎是没有好的办法。。。。
我倒是想到了个好办法,我只说3个字符:MD5

或CRC校验 就是干这个用的
liguicd 2010-02-23
  • 打赏
  • 举报
回复
引用 8 楼 veron_04 的回复:
似乎是没有好的办法。。。。

我倒是想到了个好办法,我只说3个字符:MD5
ldy888 2010-02-23
  • 打赏
  • 举报
回复

Sub jjj()
'比较速度很快的
Dim a(30000000) As Byte, b(30000000) As Byte
b(90000) = 123
If StrComp(a, b) <> 0 Then MsgBox "不相等"
End Sub
贝隆 2010-02-23
  • 打赏
  • 举报
回复
似乎是没有好的办法。。。。
skylinecn 2010-02-23
  • 打赏
  • 举报
回复
Dim a$(), b$()
If Join(a, ";") = Join(b, ";") Then MsgBox "数组相同"
倒大霉的上帝 2010-02-23
  • 打赏
  • 举报
回复

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim A() As Byte
Dim B() As Byte
Dim strPath As String
Dim lngLen As Long
Dim lngTickCount As Long

Command1.Enabled = False
strPath = "E:\个人文件\学习文件\vb.pdf" '该PDF为高级VB编程,大小10080KB(10M)
lngLen = FileLen(strPath)
ReDim A(lngLen - 1)
ReDim B(lngLen - 1)
Debug.Print lngLen 'lngLen=10321246 千万级别的

Open strPath For Binary As #1
Get #1, , A
Close #1

B = A
B(UBound(A)) = 12

lngTickCount = GetTickCount

If StrConv(A, vbUnicode) <> StrConv(B, vbUnicode) Then
Debug.Print "两个数组不相同!"
Else
Debug.Print "两个数组相同!"
End If

Debug.Print "共耗时:" & GetTickCount - lngTickCount & "毫秒" '用时437毫秒
Command1.Visible = True

End Sub
倒大霉的上帝 2010-02-23
  • 打赏
  • 举报
回复
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim A() As Byte
Dim B() As Byte
Dim strPath As String
Dim lngLen As Long
Dim lngTickCount As Long

Command1.Enabled = False
strPath = "E:\个人文件\学习文件\vb.pdf" '该PDF为高级VB编程,大小10080KB(10M)
lngLen = FileLen(strPath)
ReDim A(lngLen - 1)
ReDim B(lngLen - 1)
Debug.Print lngLen 'lngLen=10321246 千万级别的

Open strPath For Binary As #1
Get #1, , A
Close #1

B = A
B(UBound(A)) = 12

lngTickCount = GetTickCount

If StrConv(A, vbUnicode) <> StrConv(B, vbUnicode) Then
Debug.Print "两个数组不相同!"
Else
Debug.Print "两个数组相同!"
End If

Debug.Print "共耗时:" & GetTickCount - lngTickCount & "毫秒" '用时437毫秒
Command1.Visible = True

End Sub
白云飘飘飘 2010-02-23
  • 打赏
  • 举报
回复
一个一个地比较是免不了的,不过在VB中一个一个地比较的确比较慢。有两个主要的原因:
1.每次访问时要检查下标是否越界。这个可以在编译选项中关闭。关闭以后速度就快多了。
2.由于VB中数组结构的原因,每次访问元素时要做两次指针运算而不像C语言那样只做一次指针运算。这个可以考虑调用API来解决。
加载更多回复(3)

1,453

社区成员

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

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