我遇到一个问题,将ByteArrays转换为Bits,然后将它们带回来。最终我试图从ByteArray转到Hex然后回来,但是我得到的价值不同于我投入的价值。
这是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}
注意:我正在使用一些自定义类型加速器
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")
}
}
根据我发现的内容,我已将其用于转换为字节:
$result = New-Object System.Byte[] (19)
$BitArray.CopyTo($result, 0)
但是当我把它们变成字符串时,它们就不匹配了。
输入字符串代码:
$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 :(得分:0)
目前您的代码存在两个问题。
正如@PetSerAl暗示的那样,saveAsTextFile
似乎颠倒了顺序/字节顺序。
这是我个人使用的功能(移植自this C# extension method):
BitArray.CopyTo()
你的第二个问题不是转换本身,而是你在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')
会将零添加到字符串的 end ,而不是在开头。
将其更改为PadRight()
,您将获得正确的输出:
PadLeft()
答案 1 :(得分:0)
这是使用带有正则表达式的split的另一种方法。 在此声明之后:
$List | % {$BitArray[$_ - 1] = $True}
创建另一个带有一和零的数组(或字符串)
0..($BitArray.Count -1) | % {if ($BitArray[$_]) {$strBitArray += @("1")} else {$strBitArray += @("0")}}
使用正则表达式将字符串分成8位块:
$ByteArray = $strBitArray -join('') -split '(?<=\G[01]{8})(?=.)' | %{[convert]::ToInt64($_,2)}