Convertir cadena en matriz de bytes en PowerShell [3 formas]
Usando la clase System.Text.Encoding
La clase System.Text.Encoding convierte la cadena especificada en una matriz de bytes en PowerShell. Esta clase puede utilizar un formato de codificación particular, predeterminado o personalizado. Veamos cómo podemos usarlos.
Utilice la clase System.Text.Encoding con una codificación particular
Utilice la clase System.Text.Encoding con codificación específica para convertir una cadena en una matriz de bytes en PowerShell.
Utilice el formato de codificación System.Text.Encoding.ASCII:
$string = "Hello World!"
$asciiEncodingObj = [System.Text.Encoding]::ASCII
$byteArray = $asciiEncodingObj.GetBytes($string)
Write-Host "Original String is: $string"
Write-Host "Byte Array is: $byteArray"PRODUCCIÓN :
Original String is: Hello World!
Byte Array is: 72 101 108 108 111 32 87 111 114 108 100 33
Primero, inicializamos la variable $string con la cadena "Hello World!". Luego, creamos un objeto de codificación ASCII y lo almacenamos en la variable $asciiEncodingObj. Tenga en cuenta que el operador :: accedió a la propiedad estática ASCII de la clase System.Text.Encoding.
A continuación, invocamos el método GetBytes() del objeto ASCII ($asciiEncodingObj) creado en el paso anterior. El método GetBytes() tomó$string como parámetro, lo convirtió en una matriz de bytes y lo devolvió, que almacenamos en $byteArray variable. Finalmente, utilizamos el cmdlet Write-Host para imprimirlos en la consola de PowerShell. Este cmdlet se utiliza para mostrar resultados personalizados en la consola.
Ahora, en este punto, deberías preguntarte por qué utilizamos el formato de codificación ASCII. Esto se debe a que $string tenía inglés y algunos caracteres especiales admitidos por el formato de codificación ASCII. Recuerde, la codificación ASCII es una codificación de 7 bits y representa caracteres mediante un solo byte. Esta codificación se utiliza cuando necesitamos admitir solo inglés y algunos caracteres especiales porque no admite caracteres que no sean ingleses.
Tomemos otro ejemplo en el que $string contiene algunos caracteres no ingleses que no son compatibles con la codificación ASCII; vea el siguiente ejemplo.
Utilice el formato de codificación System.Text.Encoding.ASCII:
$string = "Hello 世界!"
$asciiEncodingObj = [System.Text.Encoding]::ASCII
$byteArray = $asciiEncodingObj.GetBytes($string)
Write-Host "Original String is: $string"
Write-Host "Byte Array is: $byteArray"PRODUCCIÓN :
Original String is: Hello 世界!
Byte Array is: 72 101 108 108 111 32 63 63 33En el ejemplo anterior, inicializamos $string con una combinación de caracteres ingleses y no ingleses; por ejemplo, Hello y 世界! (world! en inglés) y usé el formato de codificación ASCII para convertir el < código>$cadena a matriz de bytes. ¿Observó que no obtuvimos ningún error o excepción en PowerShell, pero el resultado devuelto no es el correcto; ¿por qué?
En PowerShell, notará que los caracteres que no son ASCII se reemplazaron con un
Buscar caracteres que no sean ASCII:
$string = "Hello 世界!"
for ($i = 0; $i -lt $string.Length; $i++) {
$character = $string[$i]
$asciiValue = [int][char]$character
if ($asciiValue -gt 127) {
Write-Host "Non-ASCII character found: $character (ASCII Value $asciiValue)"
}
}PRODUCCIÓN :
Non-ASCII character found: 世 (ASCII Value 19990)
Non-ASCII character found: 界 (ASCII Value 30028)
Encontramos dos caracteres no ASCII: 世 y 界.
Los caracteres ASCII estándar tienen valores ASCII de
0a127.
¿Qué debemos hacer si combinamos caracteres ingleses y no ingleses? ¿Tenemos otra solución para ello? Sí, lo hemos hecho. Debemos utilizar un formato de codificación diferente, como UTF-8 o UTF-16. Convirtamos la cadena "Hello 世界!" a una matriz de bytes usando el formato de codificación UTF8. Vea el siguiente ejemplo.
Utilice el formato de codificación System.Text.Encoding.UTF8:
$string = "Hello 世界!"
$utf8EncodingObj = [System.Text.Encoding]::UTF8
$byteArray = $utf8EncodingObj.GetBytes($string)
Write-Host "Original String is: $string"
Write-Host "Byte Array is: $byteArray"PRODUCCIÓN :
Original String is: Hello 世界!
Byte Array is: 72 101 108 108 111 32 228 184 150 231 149 140 33En el resultado anterior, los primeros seis bytes en $byteArray corresponden a caracteres ASCII para Hello (incluidos los espacios en blanco), mientras que los siguientes seis bytes denotan UTF8 codificación de caracteres 世界. Si decodifica esta matriz de bytes, notará que la secuencia de bytes 228 184 150 corresponde a un carácter 世, la secuencia de bytes 231 149 140 corresponde a un carácter 界 y el último valor ASCII, 33 corresponde al carácter !.
Decodifiquemos juntos $byteArray en el siguiente ejemplo:
Decodificar matriz de bytes usando codificación UTF8:
$string = "Hello 世界!"
$utf8EncodingObj = [System.Text.Encoding]::UTF8
$byteArray = $utf8EncodingObj.GetBytes($string)
$decodedByteArray = $utf8EncodingObj.GetString($byteArray)
Write-Host "Original String is: $string"
Write-Host "Byte Array is: $byteArray"
Write-Host "Decoded Byte Array is: $decodedByteArray"PRODUCCIÓN :
Original String is: Hello 世界!
Byte Array is: 72 101 108 108 111 32 228 184 150 231 149 140 33
Decoded Byte Array is: Hello 世界!Utilice la clase System.Text.Encoding con una codificación Default
Utilice la clase System.Text.Encoding con codificación Default para convertir una cadena en una matriz de bytes en PowerShell.
Utilice el formato de codificación System.Text.Encoding.Default:
$string = "Hello World!"
$defaultEncodingObj = [System.Text.Encoding]::Default
$byteArray = $defaultEncodingObj.GetBytes($string)
Write-Host "Original String is: $string"
Write-Host "Byte Array is: $byteArray"PRODUCCIÓN :
Original String is: Hello World!
Byte Array is: 72 101 108 108 111 32 87 111 114 108 100 33Esta vez, utilizamos el formato de codificación Default del sistema operativo actual para convertir $string en una matriz de bytes en PowerShell. Este tipo de codificación puede variar según la configuración regional y el sistema operativo. Principalmente, la codificación predeterminada es UTF8 o alguna variante de la página de códigos ANSI, como Windows-1252 en sistemas Windows.
La codificación
Defaultno es suficiente si se trabaja con caracteres que no son ASCII; en ese caso, usarUTF8oUTF16será beneficioso para codificar caracteres correctamente.
Utilice la clase System.Text.Encoding con codificación personalizada
Utilice la clase System.Text.Encoding con codificación personalizada para convertir una cadena en una matriz de bytes en PowerShell.
Utilice formato de codificación personalizado:
$string = "Hello World!"
$asciiEncodingObj = [System.Text.Encoding]::GetEncoding("ISO-8859-1")
$byteArray = $asciiEncodingObj.GetBytes($string)
Write-Host "Original String is: $byteArray"
Write-Host "Byte Array is: $byteArray"PRODUCCIÓN :
Original String is: Hello World!
Byte Array is: 72 101 108 108 111 32 87 111 114 108 100 33Este ejemplo de código es similar a los anteriores pero nos permite usar codificación personalizada usando el método GetEncoding(). Especificamos el formato de codificación ISO-8859-1 como argumento del método GetEncoding() para su uso posterior; puede mencionar cualquiera según las necesidades de su proyecto.
Utilice
$byteArray.GetType()para obtener el tipo de datos de la matriz de bytes. No olvide reemplazar la variable$byteArraycon el nombre de la variable de su matriz de bytes.
Hasta ahora, utilizamos varios formatos de codificación para convertir una cadena, pero ¿por qué son importantes? Convertimos cadenas en una matriz de bytes por múltiples razones, incluida la transmisión de datos, el cifrado, el hashing y la manipulación de datos binarios. Aquí viene otro punto importante; qué hacer si debe enviar una matriz de bytes y sus datos criptográficos equivalentes en formato de texto. En ese caso, podemos usar el siguiente código para convertir la matriz de bytes en hash (String->ByteArray->Hash->Base64)
Obtener hash de matriz de bytes:
$string = "Hello World!"
$asciiEncodingObj = [System.Text.Encoding]::ASCII
$byteArray = $asciiEncodingObj.GetBytes($string)
$sha = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider
$result = $sha.ComputeHash($byteArray)
$result = [System.Convert]::ToBase64String($result1)
Write-Host "Original String is: $string"
Write-Host "Byte Array is: $byteArray"
Write-Host "Byte Array in Text Form: $result"PRODUCCIÓN :
Original String is: Hello World!
Byte Array is: 72 101 108 108 111 32 87 111 114 108 100 33
Byte Array in Text Form: Lve95gjOVATpfV8EL5X4nxwjKHE=Después de tener $byteArray, utilizamos el cmdlet New-Object para crear un nuevo objeto de SHA1CryptoServiceProvider y almacenamos su referencia en el variable $sha. Luego, usamos la variable $sha para acceder a la función ComputeHash(), que tomó $byteArray como parámetro y devolvió el hash del
Guardamos este hash en la variable $result y lo encadenamos con el método ToBase64String() de la clase Convert para convertir el $result a una cadena codificada en Base64. Tenga en cuenta que actualizamos el valor de $result con el valor devuelto por el método ToBase64String(). Finalmente, utilizamos el cmdlet Write-Host para imprimir resultados personalizados en la consola de PowerShell.
