2016-07-14 14 views
1

ByteArraysをビットに変換して戻す際に問題が発生しました。結局私は当時ヘックスへのByteArrayから行くとしようとしているが、私は中に入れているよりも、私は戻って別の値を取得して抱えているPowershellバイトからビットへの配列

をこれはBitArrayセットアップです:。

$list = @(1,7,10,11,13,14,15,16,17,18,19,20,21,22,23,29,30,32,33,37,39,41,42,43,44,46,48,49,54,56,60,69,72,74,77,79,88,98,100,102,104,109,114,116,118,119,120,127,128,129,133,135,143,147) 
$BitArray = New-Object BitArray(152) 
$list | % {$BitArray[$_ - 1] = $true} 

注:私は、

$result = New-Object System.Byte[] (19) 
$BitArray.CopyTo($result, 0) 
:「いくつかのカスタム型加速器私が見つけた私はバイトに変換し、これを使用していたに基づいて

if ($(try{[accelerators]}catch{"nope"}) -eq "nope"){ 
    $xlr=[psobject].Assembly.GetType('System.Management.Automation.TypeAccelerators') 
    $xlr::Add('accelerators',([psobject].Assembly.GetType('System.Management.Automation.TypeAccelerators'))) 
} 
@{ 
    "datatable"="System.ComponentModel.MarshalByValueComponent" 
    "marshal"="System.Runtime.InteropServices.Marshal" 
    "BitArray"="System.Collections.BitArray" 
}.GetEnumerator() | %{ 
    $AcceleratorName=$_.name 
    $AcceleratorValue=$_.value 
    if (-not ((([accelerators]::get).keys | ? {$_ -eq "$AcceleratorName"} | Measure-Object).count)){ 
    [accelerators]::add("$AcceleratorName","$AcceleratorValue") 
    } 
} 

を使用してメートル3210

しかし、私は両方の文字列にそれらを有効にするときに一致しません。文字コードへ

入力:

$array = @() 
0..151 | % {if ($BitArray[$_]) {$array += 1} else {$array += 0}} 

$InputAsArray = @() 
0..18 | % { 
    $InputAsArray += ($array -join "").Substring(($_ * 8),8) 
} 

文字コードへの出力:

($result | % { [Convert]::ToString($_, 2).PadRight(8,'0')}) 

入力パターン:

10000010 
01101111 
11111110 
00001101 
10001010 
11110101 
10000101 
00010000 
00001001 
01001010 
00000001 
00000000 
01010101 
00001000 
01010111 
00000011 
10001010 
00000010 
00100000 

出力パターン:

10000010 
11110110 
11111110 
10110000 
10100010 
10101111 
10100001 
10000000 
10010000 
10100100 
10000000 
00000000 
10101010 
10000000 
11101010 
11000000 
10100010 
10000000 
10000000 
+0

を '[変換] :: ToStringメソッド($ _、2)' - > '$($のCA = [変換] :: – PetSerAl

+0

バイトまでのバイト数: '$ bytes = [byte []] @(ToStringArray) 0,1,2,3,4,5); $ bits = [Collections.BitArray] $ bytes'です。バイトへのビット: '$ bytes = [byte []] :: new([$ bits.length-1]/8)+1); $ bits.copyTo($ bytes、0) 'となります。あなたの質問には、「ByteArraysをビットに変換して戻す」という本来の目的に接続できなかったという多くのコードがあります。 – wOxxOm

+0

@PetSerAlそれを反転させると、パディングが省略されます。 – Chirishman

答えて

0

現在、あなたのコードには2つの問題があります。

@PetSerAlによって暗示されているように、BitArray.CopyTo()は、順序/エンディアンを逆にしているようです。

これは(this C# extension methodから移植された)、私が個人的に使用する機能です。

function ConvertTo-ByteArray { 

    param([System.Collections.BitArray]$BitArray) 

    $numBytes = [System.Math]::Ceiling($BitArray.Count/8) 

    $bytes = New-Object byte[] $numBytes 
    $byteIndex = 0 
    $bitIndex = 0 

    for ($i = 0; $i -lt $BitArray.Count; $i++) { 
     if ($BitArray[$i]){ 
      $bytes[$byteIndex] = $bytes[$byteIndex] -bor (1 -shl (7 - $bitIndex)) 
     } 
     $bitIndex++ 
     if ($bitIndex -eq 8) { 
      $bitIndex = 0 
      $byteIndex++ 
     } 
    } 

    ,$bytes 
} 

あなたの第二の問題は、変換自体が、あなたはbyte文字列にパディングを追加する方法ではありません。

[Convert]::ToString($_, 2).PadRight(8,'0') 

PadRight()は、開始時ではなくエンドに0を追加します。

PadLeft()に変更し、それを、あなたが正しい出力を得るでしょう:

($result | % { [Convert]::ToString($_, 2).PadLeft(8,'0')}) 
+0

'PadRight'を' PadLeft'に置き換えても、結果は '$ BitArray'を文字列に変換するコードとはまだ異なります。 – PetSerAl

+0

@PetSerAlあなたは正しいですが、私は独自の関数を使ってBitArrayを '[byte []]'に変換して期待通りの結果を得ました –

+0

@ MathiasR.Jessenありがとう!そのコードでは動作し、私は以下のようにBitArrayに往復することができます: '$ SecondBitArray = New-Object BitArray(152); $ SecondBitArray =(($ result |%{[Convert] :: ToString($ _、2).PadLeft(8、 '0')})-join "" -split "(?<= \ d)(? = \ d) ")| %{[bool] [int] $ _} ' – Chirishman

関連する問題