2016-07-14 2 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)'->'$ ($의 캘리포니아 = [변환] :: – PetSerAl

+0

Bytes to bits :'$ bytes = [byte []] @ (ToString ($ _, 2) .ToCharArray(); 0,1,2,3,4,5); $ bits = [Collections.BitArray] $ bytes'. 바이트에 대한 비트 :'$ bytes = [byte []] :: new ([$ Math] :: floor (($ bits.length-1)/8) +1); $ bits.copyTo ($ bytes, 0)'. 귀하의 질문에 많은 코드가있어서 'ByteArrays를 비트로 변환 한 다음 다시 가져 오는'이라는 원래의 목표에 연결하지 못했습니다. – wOxxOm

+0

@PetSerAl 반대로 작동하지 않습니다. 패딩이 생략됩니다. – Chirishman

답변

0

현재 코드에 두 가지 문제가 있습니다.

@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) ") | % {[bool] [int] $ _}' – Chirishman