PowerShell'de Dizeyi Bayt Dizisine Dönüştürme [3 Yol]


System.Text.Encoding Sınıfını Kullanma

System.Text.Encoding sınıfı, belirtilen dizeyi PowerShell'de bir bayt dizisine dönüştürür. Bu sınıf belirli, varsayılan veya özel bir kodlama biçimini kullanabilir. Bunları nasıl kullanabileceğimize bakalım.

System.Text.Encoding Sınıfını Belirli Bir Kodlamayla Kullanın

PowerShell'de bir dizeyi bayt dizisine dönüştürmek için System.Text.Encoding sınıfını belirli kodlamayla kullanın.

System.Text.Encoding.ASCII Kodlama Formatını Kullanın:

$string = "Hello World!"
$asciiEncodingObj = [System.Text.Encoding]::ASCII
$byteArray = $asciiEncodingObj.GetBytes($string)
Write-Host "Original String is: $string"
Write-Host "Byte Array is: $byteArray"

ÇIKTI:

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

Öncelikle $string değişkenini "Merhaba Dünya!" stringiyle başlattık. Daha sonra bir ASCII kodlama nesnesi oluşturduk ve onu $asciiEncodingObj değişkeninde sakladık. :: operatörünün, System.Text.Encoding sınıfının statik ASCII özelliğine eriştiğini unutmayın.

Daha sonra, önceki adımda oluşturulan ASCII nesnesinin ($asciiEncodingObj) GetBytes() yöntemini çağırdık. GetBytes() yöntemi parametre olarak$string'i aldı, onu bir bayt dizisine dönüştürdü ve döndürdü; biz de bunu $byteArray'de sakladık değişken. Son olarak bunları PowerShell konsolunda yazdırmak için Write-Host cmdlet'ini kullandık. Bu cmdlet, konsolda özelleştirilmiş çıktıları görüntülemek için kullanılır.

Şimdi bu noktada neden ASCII kodlama formatını kullandığımızı sormalısınız. Bunun nedeni, $string'in İngilizce içermesi ve bazı özel karakterlerin ASCII kodlama formatı tarafından desteklenmesidir. ASCII kodlamasının, karakterleri tek bir bayt kullanarak temsil eden 7 bitlik bir kodlama olduğunu unutmayın. Bu kodlama, İngilizce olmayan karakterleri desteklemediğinden yalnızca İngilizce'yi ve bazı özel karakterleri desteklememiz gereken yerlerde kullanılır.

$string'in ASCII kodlaması tarafından desteklenmeyen bazı İngilizce olmayan karakterler içerdiği başka bir örneği ele alalım; aşağıdaki örneğe bakın.

System.Text.Encoding.ASCII Kodlama Formatını Kullanın:

$string = "Hello 世界!"
$asciiEncodingObj = [System.Text.Encoding]::ASCII
$byteArray = $asciiEncodingObj.GetBytes($string)
Write-Host "Original String is: $string"
Write-Host "Byte Array is: $byteArray"

ÇIKTI:

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

Yukarıdaki örnekte, $string'i İngilizce ve İngilizce olmayan karakterlerin birleşimiyle başlattık; örneğin, Merhaba ve 世界! (İngilizce world!) ve < kodunu dönüştürmek için ASCII kodlama formatını kullandı.$string'i bayt dizisine dönüştürün. PowerShell'de herhangi bir hata veya istisna almadığımızı ancak döndürülen çıktının doğru çıktı olmadığını gözlemlediniz mi? Neden?

PowerShell'de, ASCII olmayan karakterlerin ? veya başka bir değiştirme karakteriyle değiştirildiğini ve bayt dizisindeki ASCII değerinin, ? veya başka herhangi biri; İngilizce olmayan karakterin ASCII değeri değildir. İngilizce olmayan karakterlerin gerçek ASCII değerini görmek için aşağıdaki kodu kullanalım.

ASCII Olmayan Karakterleri Bulun:

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

ÇIKTI:

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

ASCII olmayan iki karakter bulduk: 世 ve 界.

Standart ASCII karakterleri 0 ila 127 ASCII değerlerine sahiptir.

İngilizce ve İngilizce olmayan karakterleri birleştirirsek ne yapmalıyız? Buna başka bir çözümümüz var mı? Evet, yaptık. UTF-8 veya UTF-16 gibi farklı bir kodlama formatı kullanmalıyız. "Merhaba 世界!" dizesini UTF8 kodlama formatını kullanarak bir bayt dizisine dönüştürelim. Aşağıdaki örneğe bakın.

System.Text.Encoding.UTF8 Kodlama Formatını Kullanın:

$string = "Hello 世界!"
$utf8EncodingObj = [System.Text.Encoding]::UTF8
$byteArray = $utf8EncodingObj.GetBytes($string)
Write-Host "Original String is: $string"
Write-Host "Byte Array is: $byteArray"

ÇIKTI:

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

Yukarıdaki çıktıda, $byteArray'deki ilk altı bayt, Merhaba için ASCII karakterlerine (boşluk dahil) karşılık gelir, sonraki altı bayt ise UTF8<'i belirtir. diğer karakterlerin /code> kodlaması. Bu bayt dizisinin kodunu çözerseniz, 228 184 150 bayt dizisinin bir 世 karakterine, 231 149 140 bayt dizisinin karşılık geldiğini fark edeceksiniz. 界 karakterine ve son ASCII değerine karşılık gelir, 33 ! karakterine karşılık gelir.

Aşağıdaki örnekte $byteArray kodunu birlikte çözelim:

UTF8 Kodlamasını Kullanarak Bayt Dizisinin Kodunu Çözme:

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

ÇIKTI:

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

System.Text.Encoding Sınıfını Default Kodlamayla Kullanın

PowerShell'de bir dizeyi bayt dizisine dönüştürmek için System.Text.Encoding sınıfını Default kodlamayla kullanın.

System.Text.Encoding.Default Kodlama Formatını Kullan:

$string = "Hello World!"
$defaultEncodingObj = [System.Text.Encoding]::Default
$byteArray = $defaultEncodingObj.GetBytes($string)
Write-Host "Original String is: $string"
Write-Host "Byte Array is: $byteArray"

ÇIKTI:

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

Bu sefer, $string'i PowerShell'de bir bayt dizisine dönüştürmek için mevcut işletim sisteminin Default kodlama biçimini kullandık. Bu kodlama türü bölgesel ayarlara ve işletim sistemine göre değişiklik gösterebilir. Çoğunlukla, varsayılan kodlama UTF8 veya Windows sistemlerinde Windows-1252 gibi ANSIkod sayfasının bir çeşididir.

ASCII olmayan karakterlerle çalışılıyorsa Varsayılan kodlaması yeterli değildir; bu durumda UTF8 veya UTF16 kullanılması karakterlerin doğru şekilde kodlanması açısından faydalı olacaktır.

System.Text.Encoding Sınıfını Özel Kodlamayla Kullanın

PowerShell'de bir dizeyi bayt dizisine dönüştürmek için özel kodlamayla System.Text.Encoding sınıfını kullanın.

Özel Kodlama Formatını Kullan:

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

ÇIKTI:

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

Bu kod örneği öncekilere benzer ancak GetEncoding() yöntemini kullanarak özel kodlamayı kullanmamıza olanak tanır. Daha fazla kullanım için ISO-8859-1 kodlama formatını GetEncoding() yöntemine argüman olarak belirttik; proje ihtiyaçlarınıza göre herhangi birinden bahsedebilirsiniz.

Bayt dizisinin veri türünü almak için $byteArray.GetType() kullanın. $byteArray değişkenini bayt dizisi değişken adınızla değiştirmeyi unutmayın.

Şimdiye kadar bir dizeyi dönüştürmek için çeşitli kodlama formatları kullandık, ancak bunlar neden önemlidir? Veri iletimi, şifreleme, karma oluşturma ve ikili verileri işleme dahil olmak üzere birçok nedenden dolayı dizeyi bir bayt dizisine dönüştürürüz. Burada önemli bir nokta daha geliyor; bir bayt dizisini ve eşdeğer şifreleme verilerini metin biçiminde göndermeniz gerekiyorsa ne yapmalısınız? Bu durumda byte dizisini hash’e dönüştürmek için aşağıdaki kodu kullanabiliriz (String->ByteArray->Hash->Base64)

Bayt Dizisinin Karmasını Alın:

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

ÇIKTI:

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'e sahip olduktan sonra, yeni bir SHA1CryptoServiceProvider nesnesi oluşturmak için New-Object cmdlet'ini kullandık ve referansını 'de sakladık $sha değişkeni. Daha sonra, $byteArray'i parametre olarak alan ve hash değerini döndüren ComputeHash() işlevine erişmek için $sha değişkenini kullandık. $byteArray.

Bu hash'i $result değişkenine kaydettik ve $'ı dönüştürmek için Convert sınıfının ToBase64String() yöntemiyle zincirledik. sonucu Base64 kodlu bir dizeye verir. $result değerini ToBase64String() yönteminin döndürdüğü değerle güncellediğimizi unutmayın. Son olarak PowerShell konsolunda özelleştirilmiş çıktıları yazdırmak için Write-Host cmdlet'ini kullandık.

İlgili makaleler