当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 在 PowerShell 中将字符串转换为字节数组 [3 种方法]

作者:精品下载站 日期:2024-12-14 05:29:02 浏览:13 分类:玩电脑

在 PowerShell 中将字符串转换为字节数组 [3 种方法]


[玩转系统] 在 PowerShell 中将字符串转换为字节数组 [3 种方法]

使用 System.Text.Encoding 类

System.Text.Encoding 类将指定的字符串转换为 PowerShell 中的字节数组。此类可以使用特定的、默认的或自定义的编码格式。让我们看看如何使用它们。

使用具有特定编码的 System.Text.Encoding 类

使用具有特定编码的 System.Text.Encoding 类在 PowerShell 中将字符串转换为字节数组。

使用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"

输出 :

Original String is: Hello World!
Byte Array is: 72 101 108 108 111 32 87 111 114 108 100 33

首先,我们使用 "Hello World!" 字符串初始化 $string 变量。然后,我们创建了一个 ASCII 编码对象并将其存储在 $asciiEncodingObj 变量中。请注意,:: 运算符访问了 System.Text.Encoding 类的静态 ASCII 属性。

接下来,我们调用上一步中创建的 ASCII 对象 ($asciiEncodingObj) 的 GetBytes() 方法。 GetBytes() 方法将 $string 作为参数,将其转换为字节数组并返回,我们将其存储在 $byteArray 中多变的。最后,我们使用 Write-Host cmdlet 在 PowerShell 控制台上打印它们。此 cmdlet 用于在控制台上显示自定义输出。

现在,您应该问为什么我们使用 ASCII 编码格式。这是因为$string中有英文以及ASCII编码格式支持的一些特殊字符。请记住,ASCII 编码是 7 位编码,使用单个字节表示字符。这种编码用于我们只需要支持英文和一些特殊字符的地方,因为它不支持非英文字符。

我们再举一个例子,其中 $string 包含一些 ASCII 编码不支持的非英语字符;请参见以下示例。

使用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"

输出 :

Original String is: Hello 世界!
Byte Array is: 72 101 108 108 111 32 63 63 33

在上面的例子中,我们用英文和非英文字符的组合来初始化$string;例如Hello世界!(英文为world!),并使用ASCII编码格式将$string 到字节数组。您是否注意到,我们在 PowerShell 中没有收到任何错误或异常,但返回的输出不正确;为什么?

在 PowerShell 中,您会注意到非 ASCII 字符被替换为 ? 或任何其他替换字符,并且字节数组中的 ASCII 值就是被替换字符的值,无论它是 >? 或任何其他;它不是非英语字符的 ASCII 值。我们用下面的代码来看看非英文字符的实际 ASCII 值。

查找非 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)"
    }
}

输出 :

Non-ASCII character found: 世 (ASCII Value 19990)
Non-ASCII character found: 界 (ASCII Value 30028)

我们发现了两个非 ASCII 字符:

标准 ASCII 字符具有 0127 ASCII 值。

如果把英文和非英文字符组合起来怎么办?我们还有其他解决方案吗?是的,我们有。我们必须使用不同的编码格式,例如 UTF-8UTF-16。让我们使用 UTF8 编码格式将 "Hello World!" 字符串转换为字节数组。请参阅以下示例。

使用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"

输出 :

Original String is: Hello 世界!
Byte Array is: 72 101 108 108 111 32 228 184 150 231 149 140 33

在上面的输出中,$byteArray 中的前六个字节对应于 Hello 的 ASCII 字符(包括空格),而接下来的六个字节表示 UTF8 世界 字符的编码。如果你解码这个字节数组,你会注意到字节序列 228 184 150 对应于一个 字符,字节序列 231 149 140对应于字符和最后一个ASCII值,33对应于!字符。

让我们在以下示例中一起解码 $byteArray

使用 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"

输出 :

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 世界!

使用具有 Default 编码的 System.Text.Encoding

在 PowerShell 中使用 System.Text.Encoding 类和 Default 编码将字符串转换为字节数组。

使用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"

输出 :

Original String is: Hello World!
Byte Array is: 72 101 108 108 111 32 87 111 114 108 100 33

这次,我们使用当前操作系统的Default编码格式,在PowerShell中将$string转换为字节数组。此编码类型可能因区域设置和操作系统而异。大多数情况下,默认编码是 UTF8ANSI 代码页的某些变体,例如 Windows 系统上的 Windows-1252。

如果使用非 ASCII 字符,Default 编码是不够的;在这种情况下,使用 UTF8UTF16 将有利于正确编码字符。

使用具有自定义编码的 System.Text.Encoding

使用具有自定义编码的 System.Text.Encoding 类在 PowerShell 中将字符串转换为字节数组。

使用自定义编码格式:

$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"

输出 :

Original String is: Hello World!
Byte Array is: 72 101 108 108 111 32 87 111 114 108 100 33

此代码示例与前面的代码示例类似,但允许我们通过 GetEncoding() 方法使用自定义编码。我们将 ISO-8859-1 编码格式指定为 GetEncoding() 方法的参数以供进一步使用;您可以根据您的项目需求提及任何内容。

使用 $byteArray.GetType() 获取字节数组的数据类型。不要忘记将 $byteArray 变量替换为字节数组变量名称。

到目前为止,我们使用了各种编码格式来转换字符串,但为什么它们很重要?我们出于多种原因将字符串转换为字节数组,包括数据传输、加密、散列和操作二进制数据。这里还有一个重要的点;如果必须以文本格式发送字节数组及其等效的加密数据该怎么办。在这种情况下,我们可以使用以下代码将字节数组转换为哈希(String->ByteArray->Hash->Base64)

获取字节数组的哈希值:

$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"

输出 :

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=

获得 $byteArray 后,我们使用 New-Object cmdlet 创建 SHA1CryptoServiceProvider 的新对象,并将其引用存储在 $sha 变量。然后,我们使用 $sha 变量访问 ComputeHash() 函数,该函数将 $byteArray 作为参数并返回$byteArray

我们将此哈希值保存在 $result 变量中,并将其与 Convert 类的 ToBase64String() 方法链接起来以转换 $result 为 Base64 编码的字符串。请注意,我们使用 ToBase64String() 方法返回的值更新了 $result 的值。最后,我们使用 Write-Host cmdlet 在 PowerShell 控制台上打印自定义输出。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯