Преобразование строки текстовых единиц и нулей в цифровые и нули в PowerShell - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь найти способ, как преобразовать большой набор единиц и нулей (в текстовой форме) в цифровые и нули в качестве файла вывода.

Самый многообещающий подход, который я пробовалбыло преобразование, скажем, строки 01001101 в десятичное число 77, затем преобразование числа 77 в символ таблицы кодирования M, а затем запись M в новый файл, который создаст файл с цифровыми битами 01001101.Это неудобное решение, однако, портит данные, потому что некоторые двоичные значения не обрабатываются правильно.Вот код:

Эта часть создает текстовые единицы и нули из файла цифровых данных:

$SourceFile = "C:\Users\Admin\Desktop\test.bin"
$TargetFile = "C:\Users\Admin\Desktop\test.bin" + "_clean"
$filestream = New-Object IO.FileStream -ArgumentList $SourceFile, ([IO.FileMode]::Open), ([IO.FileAccess]::Read)

$filestream.Position = 0
$bytebuffer = New-Object "Byte[]" -ArgumentList 128
[void]$filestream.Read($bytebuffer, 0, $bytebuffer.Length)
$filestream.Close()

$OnesZeroes = $bytebuffer -split "`n" | ForEach-Object {
    [System.Convert]::ToString($_,2).PadLeft(8,'0')
}

Эта часть пытается преобразовать текстовые единицы и нули обратно в цифровые данные:

$RawData = $OnesZeroes | ForEach-Object {[CHAR]([CONVERT]::toint32($_,2))}

$RawData = $RawData -join ""

$OutputRAW = [System.IO.StreamWriter] $TargetFile
$filesize = (Get-Item $SourceFile).length
[void]$OutputRAW.Write($RawData, 0, $filesize)
$OutputRAW.close()

Кто-то может удивиться, почему я пытаюсь выполнить такую ​​странную операцию.Мне нужно статистически обрабатывать и изменять отдельные биты в большом файле, где отдельные части данных не являются целым числом байтов.В частности, для сравнения побитовых первых 1150 битов со вторыми 1150 битами и с третьими 1150 битами и т. Д. В наборе 16x1150 битов, где весь файл имеет около 2000 наборов 16x1150 битов.Я не знаю, как обрабатывать отдельные биты, поэтому я сделал неловкий обходной путь, сначала преобразовав биты в байты «1» и «0».

1 Ответ

0 голосов
/ 10 июня 2018

Согласно моим дальнейшим исследованиям и хорошим советам от LotPings использование класса .net BitArray кажется универсальным ответом на все трудности.После некоторых проб и ошибок я наконец-то получил подход класса .net BitArray!

$SourceFile = "C:\Users\Admin\Desktop\test.bin"
$FileSize = (Get-Item $SourceFile).length
$SourceBytes = [System.IO.File]::ReadAllBytes($SourceFile)
$BitArray = [System.Collections.BitArray]($SourceBytes)

$BitArray.Set(15746, 0) #Modify one bit as a test

$ByteArray = New-Object Byte[] $FileSize
$BitArray.Copyto($ByteArray,0)
[System.IO.File]::WriteAllBytes($SourceFile + "_clean", $ByteArray)

Теперь я могу манипулировать отдельными битами как логическими значениями и сохранять результат в двоичном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...