Matriz de bytes en PowerShell

Salman Mehmood 20 junio 2023
  1. Convertir datos en una matriz de bytes en PowerShell
  2. Convierta datos en una matriz de bytes en PowerShell 5+
  3. Convierta datos en una matriz de bytes en PowerShell 7+
  4. Convertir matriz de bytes en cadena en PowerShell
  5. Convertir cadena en matriz de bytes en PowerShell
Matriz de bytes en PowerShell

Este artículo tiene como objetivo demostrar cómo convertir datos presentes en varios formularios en una matriz de bytes utilizando la API de secuencias de comandos de PowerShell.

Convertir datos en una matriz de bytes en PowerShell

Al automatizar tareas y manejar datos, es posible que los datos deban procesarse de una manera específica para extraer información útil o modificar datos de manera significativa. A veces, el manejo de estos datos en PowerShell puede volverse un inconveniente, especialmente en otro tipo de datos.

Para facilitar el procesamiento o reducir la cantidad de cálculos de procesamiento, en algunos casos puede ser ideal convertir los datos en una matriz de bytes y luego realizar operaciones en eso en lugar de los datos originales.

Considere el siguiente código:

$data = Get-Content "a.exe"

Get-Item "a.exe" | Format-List -Property * -Force
Write-Host "File Datatype: "$data.GetType().Name

Esto da la siguiente salida:

< Output redacted >
.
.
.
.
BaseName            : a
Target              :
LinkType            :
Length              : 400644
.
.
.
Extension           : .exe
Name                : a.exe
Exists              : True
.
.
.
.
.
Attributes          : Archive
File Datatype:  Object[]

De la salida anterior, el archivo que hemos abierto es un archivo ejecutable de Windows (exe). Después de observar sus atributos con los cmdlets Get-Item y Format-List, se puede obtener información significativa sobre el archivo, especialmente el tamaño, que puede resultar bastante útil durante las iteraciones.

Un aspecto desfavorable de esta situación es que los datos del archivo recuperados mediante el cmdlet Get-Content es que se devuelve Object[].

Veamos cómo podemos convertir esto en Byte[] para operaciones dependientes del escenario.

Convierta datos en una matriz de bytes en PowerShell 5+

Considere el siguiente código:

$file = "a.exe"

[byte[]]$data = Get-Content $file -Encoding Byte
Write-Host "File Datatype: "$data.GetType().Name

for($i=0; $i -lt 10; $i++) { Write-Host $data[$i] }

Esto da la siguiente salida:

File Datatype:  Byte[]
Byte No 0 :  77
Byte No 1 :  90
Byte No 2 :  144
Byte No 3 :  0
Byte No 4 :  3
Byte No 5 :  0
Byte No 6 :  0
Byte No 7 :  0
Byte No 8 :  4
Byte No 9 :  0
Byte No 10 :  0

Con la conversión de tipos y el parámetro -Encoding, es posible leer el archivo como una matriz de bytes directamente. Podemos verificar que el resultado es efectivamente una matriz de bytes utilizando el método GetType() y accediendo a su propiedad llamada Nombre.

Para verificar aún más que los datos se han convertido correctamente, podemos escribir un pequeño bucle for e imprimir algunos de los bytes del archivo.

Convierta datos en una matriz de bytes en PowerShell 7+

Considere el siguiente código:

[byte[]]$data = Get-Content "a.exe" -AsByteStream

Write-Host $data.GetType().Name

Esto da la siguiente salida:

textByte[]

La mayor parte de la sintaxis es la misma entre versiones. La única diferencia es que -Encoding Byte ha sido reemplazado por -AsByteStream.

Convertir matriz de bytes en cadena en PowerShell

Convertir cualquier matriz de bytes dada en una cadena es fácil. Considere el siguiente código:

$array = @(0x54,0x68,0x65,0x20,0x6f,0x62,0x6a,0x65,0x63,0x74,0x20,0x6f,0x66,0x20,0x6c,0x69,0x66,0x65,0x20,0x69,0x73,0x20,0x6e,0x6f,0x74,0x20,0x74,0x6f,0x20,0x62,0x65,0x20,0x6f,0x6e,0x20,0x74,0x68,0x65,0x20,0x73,0x69,0x64,0x65,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x6d,0x61,0x6a,0x6f,0x72,0x69,0x74,0x79,0x2c,0x20,0x62,0x75,0x74,0x20,0x74,0x6f,0x20,0x65,0x73,0x63,0x61,0x70,0x65,0x20,0x66,0x69,0x6e,0x64,0x69,0x6e,0x67,0x20,0x6f,0x6e,0x65,0x73,0x65,0x6c,0x66,0x20,0x69,0x6e,0x20,0x74,0x68,0x65,0x20,0x72,0x61,0x6e,0x6b,0x73,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x69,0x6e,0x73,0x61,0x6e,0x65,0x2e)

$string = [System.Text.Encoding]::UTF8.GetString($array)
$string

Lo que da la siguiente salida:

The object of life is not to be on the side of the majority but to escape finding oneself in the ranks of the insane.

Usando el método UTF8.GetString, podemos convertir cualquier matriz de bytes codificados en UTF8 de nuevo en su representación de cadena. Asegúrese de buscar la codificación del texto, ya que el uso de este método en otras codificaciones (como ASCII) puede generar resultados anormales.

Convertir cadena en matriz de bytes en PowerShell

De manera similar a cómo una matriz de bytes se puede convertir en su representación de cadena, una cadena también se puede convertir en su representación de byte.

Considere el siguiente código:

$string = "Never esteem anything as of advantage to you that will make you break your word or lose your self-respect."

$bytes = [System.Text.Encoding]::Unicode.GetBytes($string)
Write-Host "First 10 Bytes of String are: "

for($i=0; $i -lt 10; $i++) { Write-Host $bytes[$i] }

Esto da la salida:

First 10 Bytes of String are:
78
0
101
0
118
0
101
0
114
0

Unicode.GetBytes se puede usar en este escenario específico para obtener bytes de una cadena Unicode. Asegúrese de que la cadena sea Unicode; de lo contrario, la conversión puede provocar la pérdida de datos importantes.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - PowerShell Array