powershell 中的类型转换字节

Typecast bytes in powershell

在 C 中,我有以下代码

struct _file_header* file_header = (struct _file_header*)(cfg_bytes + (cfg_size - 16));

这有效地用内存中的字节填充了 _file_header 结构。我想在 Powershell 中做同样的事情,但我对 [System.Text.Encoding]::ASCII.GetBytes 返回一些与我在 cfg_bytes

中看到的数据无关的字节感到困惑

采用以下PowerShell代码,

$cfg_bytes   = (Get-Content $env:ProgramData'\config.bin' -Raw)
$cfg_size    = [System.Text.Encoding]::ASCI.GetByteCount($cfg_bytes)
$file_header = $cfg_bytes.Substring($cfg_size - 16, 16)

当我 Write-Output [System.Text.Encoding]::ASCII.GetBytes($file_header) 时,输出与我从调试器内存查看器中看到的不同。我怎样才能获得与 C 示例格式相同的字节,以便我能够在 PowerShell 中读取相同的结构?

作为Santiago Squarzon 建议,使用以下命令在 PowerShell 中直接获取文件的 原始字节

  • Windows PowerShell:
$cfg_bytes = Get-Content -Encoding Byte -Raw $env:ProgramData\config.bin 
  • PowerShell(核心)7+:
$cfg_bytes = Get-Content -AsByteStream -Raw $env:ProgramData\config.bin 

注意:两个 PowerShell 版本之间语法的这种重大变化是不幸的,并且可以说本不应该发生 - 参见 GitHub issue #7986.

请注意,将 -Raw 添加到 Get-Content 调用 - 当与 -Encoding Byte / -AsByteStream 结合时 - 有效地 returns 所有字节 作为单个数组 ,强类型为 [byte[]].

如果没有 -Raw,字节将被 流式处理 - 即输出到管道 一个一个 - 其中,如果未累积输出,则保持内存使用不变 - 但速度要慢得多。