HashAlgorithm.TransformFinalBlock(Byte[], Int32, Int32) Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Beräknar hash-värdet för den angivna regionen för den angivna bytematrisen.
public:
virtual cli::array <System::Byte> ^ TransformFinalBlock(cli::array <System::Byte> ^ inputBuffer, int inputOffset, int inputCount);
public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount);
abstract member TransformFinalBlock : byte[] * int * int -> byte[]
override this.TransformFinalBlock : byte[] * int * int -> byte[]
Public Function TransformFinalBlock (inputBuffer As Byte(), inputOffset As Integer, inputCount As Integer) As Byte()
Parametrar
- inputBuffer
- Byte[]
Indata för att beräkna hash-koden för.
- inputOffset
- Int32
Förskjutningen till bytematrisen som du vill börja använda data från.
- inputCount
- Int32
Antalet byte i bytematrisen som ska användas som data.
Returer
En matris som är en kopia av den del av indata som hashats.
Implementeringar
Undantag
inputCount använder ett ogiltigt värde.
-eller-
inputBuffer har en ogiltig förskjutningslängd.
inputBuffer är null.
inputOffset är utom räckhåll. Den här parametern kräver ett icke-negativt tal.
Objektet har redan tagits bort.
Exempel
I följande kodexempel används TransformFinalBlock metoden med TransformBlock metoden för att hash-en sträng.
using System;
using System.Security.Cryptography;
using System.Text;
class MainClass
{
public static void Main()
{
RandomNumberGenerator rnd = RandomNumberGenerator.Create();
byte[] input = new byte[20];
rnd.GetBytes(input);
Console.WriteLine("Input : {0}\n", BytesToStr(input));
PrintHash(input);
PrintHashOneBlock(input);
PrintHashMultiBlock(input, 1);
PrintHashMultiBlock(input, 2);
PrintHashMultiBlock(input, 3);
PrintHashMultiBlock(input, 5);
PrintHashMultiBlock(input, 10);
PrintHashMultiBlock(input, 11);
PrintHashMultiBlock(input, 19);
PrintHashMultiBlock(input, 20);
PrintHashMultiBlock(input, 21);
}
public static string BytesToStr(byte[] bytes)
{
StringBuilder str = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
str.AppendFormat("{0:X2}", bytes[i]);
return str.ToString();
}
public static void PrintHash(byte[] input)
{
SHA256Managed sha = new SHA256Managed();
Console.WriteLine("ComputeHash : {0}", BytesToStr(sha.ComputeHash(input)));
}
public static void PrintHashOneBlock(byte[] input)
{
SHA256Managed sha = new SHA256Managed();
sha.TransformFinalBlock(input, 0, input.Length);
Console.WriteLine("FinalBlock : {0}", BytesToStr(sha.Hash));
}
public static void PrintHashMultiBlock(byte[] input, int size)
{
SHA256Managed sha = new SHA256Managed();
int offset = 0;
while (input.Length - offset >= size)
offset += sha.TransformBlock(input, offset, size, input, offset);
sha.TransformFinalBlock(input, offset, input.Length - offset);
Console.WriteLine("MultiBlock {0:00}: {1}", size, BytesToStr(sha.Hash));
}
}
/*
This example produces output similar to the following:
Input : 45D97219908A572DE336B9DEC787C311D3349F69
ComputeHash : 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
FinalBlock : 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
MultiBlock 01: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
MultiBlock 02: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
MultiBlock 03: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
MultiBlock 05: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
MultiBlock 10: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
MultiBlock 11: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
MultiBlock 19: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
MultiBlock 20: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
MultiBlock 21: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
*/
Imports System.Text
Imports System.Security.Cryptography
Class Program
Public Shared Sub Main()
Dim rnd As RandomNumberGenerator = RandomNumberGenerator.Create
Dim input() As Byte = New Byte((20) - 1) {}
rnd.GetBytes(input)
Console.WriteLine("Input : {0}"& vbLf, BytesToStr(input))
PrintHash(input)
PrintHashOneBlock(input)
PrintHashMultiBlock(input, 1)
PrintHashMultiBlock(input, 2)
PrintHashMultiBlock(input, 3)
PrintHashMultiBlock(input, 5)
PrintHashMultiBlock(input, 10)
PrintHashMultiBlock(input, 11)
PrintHashMultiBlock(input, 19)
PrintHashMultiBlock(input, 20)
PrintHashMultiBlock(input, 21)
End Sub
Public Shared Function BytesToStr(ByVal bytes() As Byte) As String
Dim str As StringBuilder = New StringBuilder
Dim i As Integer = 0
Do While (i < bytes.Length)
str.AppendFormat("{0:X2}", bytes(i))
i = (i + 1)
Loop
Return str.ToString
End Function
Public Shared Sub PrintHash(ByVal input() As Byte)
Dim sha As SHA256Managed = New SHA256Managed
Console.WriteLine("ComputeHash : {0}", BytesToStr(sha.ComputeHash(input)))
End Sub
Public Shared Sub PrintHashOneBlock(ByVal input() As Byte)
Dim sha As SHA256Managed = New SHA256Managed
sha.TransformFinalBlock(input, 0, input.Length)
Console.WriteLine("FinalBlock : {0}", BytesToStr(sha.Hash))
End Sub
Public Shared Sub PrintHashMultiBlock(ByVal input() As Byte, ByVal size As Integer)
Dim sha As SHA256Managed = New SHA256Managed
Dim offset As Integer = 0
While ((input.Length - offset) _
>= size)
offset = (offset + sha.TransformBlock(input, offset, size, input, offset))
End While
sha.TransformFinalBlock(input, offset, (input.Length - offset))
Console.WriteLine("MultiBlock {0:00}: {1}", size, BytesToStr(sha.Hash))
End Sub
End Class
' This example produces output similar to the following:
'
' Input : 45D97219908A572DE336B9DEC787C311D3349F69
'
' ComputeHash : 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
' FinalBlock : 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
' MultiBlock 01: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
' MultiBlock 02: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
' MultiBlock 03: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
' MultiBlock 05: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
' MultiBlock 10: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
' MultiBlock 11: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
' MultiBlock 19: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
' MultiBlock 20: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
' MultiBlock 21: 84E87322C7E3BCA848B0A698EE66E9A9725DA786F9FD4FFD46C385F59AB35B15
Kommentarer
Du måste anropa TransformFinalBlock metoden när du har anropat TransformBlock metoden, men innan du hämtar det slutliga hashvärdet.
Observera att returvärdet för den här metoden inte är hash-värdet, utan bara en kopia av den hashade delen av indata. Hämta det slutliga hash-värdet när du har anropat TransformFinalBlock metoden genom att hämta bytematrisen som finns i egenskapen Hash .