HashAlgorithm.TransformBlock(Byte[], Int32, Int32, Byte[], Int32) Метод
Определение
Вычисляет хэш-значение для заданной области входного массива байтов и копирует указанную область входного массива байтов в заданную область выходного массива байтов.Computes the hash value for the specified region of the input byte array and copies the specified region of the input byte array to the specified region of the output byte array.
public:
virtual int TransformBlock(cli::array <System::Byte> ^ inputBuffer, int inputOffset, int inputCount, cli::array <System::Byte> ^ outputBuffer, int outputOffset);
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);
abstract member TransformBlock : byte[] * int * int * byte[] * int -> int
override this.TransformBlock : byte[] * int * int * byte[] * int -> int
Public Function TransformBlock (inputBuffer As Byte(), inputOffset As Integer, inputCount As Integer, outputBuffer As Byte(), outputOffset As Integer) As Integer
Параметры
- inputBuffer
- Byte[]
Входные данные, для которых вычисляется хэш-код.The input to compute the hash code for.
- inputOffset
- Int32
Смещение во входном массиве байтов, начиная с которого следует использовать данные.The offset into the input byte array from which to begin using data.
- inputCount
- Int32
Число байтов во входном массиве для использования в качестве данных.The number of bytes in the input byte array to use as data.
- outputBuffer
- Byte[]
Копия части входного массива, используемого для вычисления хэш-кода.A copy of the part of the input array used to compute the hash code.
- outputOffset
- Int32
Смещение в выходном массиве байтов, начиная с которого следует записывать данные.The offset into the output byte array from which to begin writing data.
Возвращаемое значение
Число записанных байтов.The number of bytes written.
Реализации
Исключения
Недопустимое значение параметра inputCount
.inputCount
uses an invalid value.
- или --or-
Недопустимая длина значения параметра inputBuffer
.inputBuffer
has an invalid length.
inputBuffer
— null
.inputBuffer
is null
.
inputOffset
выходит за пределы допустимого диапазона.inputOffset
is out of range. Значение этого параметра не должно быть отрицательным.This parameter requires a non-negative number.
Объект уже удален.The object has already been disposed.
Примеры
В следующих примерах кода TransformFinalBlock TransformBlock для хэширования строки используется метод с методом.The following code examples use the TransformFinalBlock method with the TransformBlock method to hash a string.
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
Комментарии
TransformBlockПеред вызовом метода необходимо вызвать метод TransformFinalBlock .You must call the TransformBlock method before calling the TransformFinalBlock method. Перед получением окончательного хэш-значения необходимо вызвать оба метода.You must call both methods before you retrieve the final hash value.
Чтобы получить конечное хэш-значение после вызова TransformFinalBlock метода, получите массив байтов, содержащийся в Hash свойстве.To retrieve the final hash value after calling the TransformFinalBlock method, get the byte array contained within the Hash property.
Вызов TransformBlock метода с различными входными и выходными массивами приводит к возникновению IOException .Calling the TransformBlock method with different input and output arrays results in an IOException.