HashAlgorithm.TransformBlock(Byte[], Int32, Int32, Byte[], Int32) Metodo

Definizione

Consente di calcolare il valore hash dell'area specifica della matrice di byte di input e di copiare una determinata area della matrice di byte di input nell'area specifica della matrice di byte di output.

public int TransformBlock (byte[] inputBuffer, int inputOffset, int inputCount, byte[]? outputBuffer, int outputOffset);
public int TransformBlock (byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset);

Parametri

inputBuffer
Byte[]

Input per il quale calcolare il codice hash.

inputOffset
Int32

Offset nella matrice di byte di input dal quale iniziare a utilizzare i dati.

inputCount
Int32

Numero di byte nella matrice di byte di input da usare come dati.

outputBuffer
Byte[]

Copia della parte della matrice di input utilizzata per calcolare il codice hash.

outputOffset
Int32

Offset nella matrice di byte di output dal quale iniziare a scrivere i dati.

Restituisce

Numero di byte scritti.

Implementazioni

Eccezioni

inputCountutilizza un valore non valido.

-oppure-

La lunghezza di inputBuffernon è valida.

inputBuffer è null.

inputOffset non è compreso nell'intervallo consentito. Per questo parametro è richiesto un numero non negativo.

L'oggetto è già stato eliminato.

Esempio

Negli esempi di codice seguenti viene usato il TransformFinalBlock metodo con il metodo per eseguire l'hashing TransformBlock di una stringa.

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

*/

Commenti

È necessario chiamare il TransformBlock metodo prima di chiamare il TransformFinalBlock metodo . È necessario chiamare entrambi i metodi prima di recuperare il valore hash finale.

Per recuperare il valore hash finale dopo aver chiamato il TransformFinalBlock metodo , ottenere la matrice di byte contenuta all'interno della Hash proprietà .

La chiamata al TransformBlock metodo con matrici di input e output diverse genera un oggetto IOException.

Si applica a

Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1