2013-10-17 46 views
1

好吧,我想要做的就是比較vb.net中的2個字節數組。我試圖這些代碼:如何比較vb.net中的字節數組

If Byte.ReferenceEquals(bytearrayone, bytearraytwo) Then 
    MsgBox("Yes", MsgBoxStyle.Information) 
Else 
    MsgBox("No", MsgBoxStyle.Critical) 
End If 

而且

If Array.ReferenceEquals(bytearrayone, bytearraytwo) Then 
    MsgBox("Yes", MsgBoxStyle.Information) 
Else 
    MsgBox("No", MsgBoxStyle.Critical) 
End If 

兩個字節陣列是相同的,一個陣列從一個資源文件,並從計算機上的其他以字節。出於測試目的,我在兩個數組中使用了相同的文件,但根據所提供的代碼,我得到的都是No。兩者都有相同的長度,我穿過他們兩個,都有相同的字節相同的點。那麼怎麼了?我應該使用哪些代碼?請幫幫我。

+0

'ReferenceEquals - 確定指定的System.Object實例是否是相同的實例。「它不會比較數組CONTENTS,但是2個引用是否相同。 – Plutonix

+0

哦,我明白了,所以我應該使用哪些代碼來比較內容,請告訴 –

回答

5

使用SequenceEqual

Dim foo() As Byte = {1, 2, 3, 4} 
    Dim barT() As Byte = {1, 2, 3, 4} 
    Dim barF() As Byte = {1, 2, 3, 5} 

    Dim fooEqbarT As Boolean = foo.SequenceEqual(barT) 
    Dim fooEqbarF As Boolean = foo.SequenceEqual(barF) 

    Debug.WriteLine(fooEqbarT) 
    Debug.WriteLine(fooEqbarF) 

比較兩個小文件

Dim path1 As String = "pathnameoffirstfile" 
    Dim path2 As String = "pathnameofsecondfile" 

    Dim foo() As Byte = IO.File.ReadAllBytes(path1) 
    Dim bar() As Byte = IO.File.ReadAllBytes(path2) 

    If foo.SequenceEqual(bar) Then 
     'identical 
    Else 
     'different 
    End If 
+0

我想比較每一個字節,而不是從中間的序列。我不想循環所有,我想在一眨眼之間做到這一點,請幫助 –

+0

@AfnanMakhdoom,因爲他們是字節,應該工作。否則,如果你不想循環所有的東西,你不應該使用數組。 – Plutonix

+0

@Plutonix我還可以使用什麼來比較資源和本地文件中的文件? –

1

如果你的目的是比較2個文件,看是否內容是相同的,沒有關於該文件的問候信息(即修改日期,名稱,類型等),您應該對這兩個文件使用散列。這是我用了一段時間的一些代碼。有很多方法可以做到這一點。

''' <summary> 
''' Method to get a unique string to idenify the contents of a file. 
''' Works on any type of file but may be slow on files 1 GB or more and large files across the network. 
''' </summary> 
''' <param name="FI">System.IO.FileInfo for the file you want to process</param> 
''' <returns>String around 50 characters long (exact length varies)</returns> 
''' <remarks>A change in even 1 byte of the file will cause the string to vary 
''' drastically so you cannot use this to see how much it differs by.</remarks> 
Public Shared Function GetContentHash(ByVal FI As System.IO.FileInfo) As String 
    Dim SHA As New System.Security.Cryptography.SHA512Managed() 
    Dim sBuilder As System.Text.StringBuilder 
    Dim data As Byte() 
    Dim i As Integer 
    Using fs As New IO.FileStream(FI.FullName, IO.FileMode.Open) 
     data = SHA.ComputeHash(fs) 
     fs.Flush() 
     fs.Close() 
    End Using 
    sBuilder = New System.Text.StringBuilder 
    ' Loop through each byte of the hashed data 
    ' and format each one as a hexadecimal string. 
    For i = 0 To data.Length - 1 
     sBuilder.Append(data(i).ToString("x2")) 
    Next i 
    Return sBuilder.ToString() 
End Function 

您需要在每個文件上運行該命令,以獲得唯一標識文件的字符串,然後比較2個字符串。

+0

如果你有一組文件(a,b,c,d),並且你想知道a = b和c = d那麼生成一個散列需要比只比較字節花費更多的時間。如果你想要a = b,a = c和a = d,那麼可能會節省一些時間。 – dbasnett

+0

@Steve「x2」在最後一個For循環中的含義是什麼? –

+0

@AfnanMakhdoom - 請做一些嘗試做你自己的研究。 http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx – dbasnett