我正试图找到一种方法,如何将大量的1和0(以文本形式)转换为数字1和0作为文件输出。
我尝试过的最有希望的方法是将字符串01001101转换为十进制数字77,然后将数字77转换为编码表字符M,然后将M写入新文件,这将创建一个包含01001101数字位的文件。然而,这种笨拙的解决方案会破坏数据,因为某些二进制值未得到正确处理。这是代码:
此部分从数字数据文件创建文本1和0:
$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')
}
此部分尝试将文本1和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()
有人可能在想,为什么我要尝试执行这么奇怪的操作。我需要统计处理和修改大文件中的各个位,其中数据的各个部分不是整数个字节。特别是在一组16x1150位中逐位比较第一个1150位到第二个1150位和第三个1150位,依此类推,其中整个文件具有大约2000组16x1150位。我不知道,如何处理单个位,所以我通过先将位转换为“1”和“0”字节来做出尴尬的解决方法。
答案 0 :(得分:1)
根据我的进一步研究和来自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)
现在我可以将各个位操作为布尔值并将结果保存为二进制文件。