Share via


HashAlgorithm.TransformFinalBlock(Byte[], Int32, Int32) Metoda

Definice

Vypočítá hodnotu hash pro zadanou oblast zadaného pole bajtů.

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()

Parametry

inputBuffer
Byte[]

Vstup pro výpočet hashového kódu.

inputOffset
Int32

Posun pole bajtů, ze kterého chcete začít používat data.

inputCount
Int32

Počet bajtů v bajtovém poli, které se mají použít jako data.

Návraty

Byte[]

Pole, které je kopií části vstupu, která je hashována.

Implementuje

Výjimky

inputCount používá neplatnou hodnotu.

-nebo-

inputBuffer má neplatnou délku posunu.

inputBuffer je null.

inputOffset je mimo rozsah. Tento parametr vyžaduje nezáporné číslo.

Objekt již byl odstraněn.

Příklady

Následující příklady kódu používají metodu TransformFinalBlock s metodou TransformBlock hash řetězce.

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

Poznámky

Metodu TransformFinalBlock musíte volat po volání metody, TransformBlock ale před načtením konečné hodnoty hash.

Všimněte si, že návratová hodnota této metody není hodnota hash, ale pouze kopie hashované části vstupních dat. Pokud chcete po volání TransformFinalBlock metody načíst konečnou hodnotu hash, získejte pole bajtů obsažené ve Hash vlastnosti .

Platí pro