Powershell 大十六进制范围

Powershell large hex range

我正在尝试从 a000000000-afffffffff 生成一个十六进制范围,但这些值对于 Int32 来说太大了。获取错误 Cannot convert value "687194767360" to type "System.Int32". Error: "Value was either too large or too small for an Int32."

这是代码 (0xa000000000..0xafffffffff|% ToString X10).ToLower()

无法使用 System.Array:

将集合作为一个整体保存

The array size is limited to a total of 4 billion elements, and to a maximum index of 0X7FEFFFFF in any given dimension (0X7FFFFFC7 for byte arrays and arrays of single-byte structures).

也不使用List<T>:

.NET Framework only: For very large List objects, you can increase the maximum capacity to 2 billion elements on a 64-bit system by setting the enabled attribute of the configuration element to true in the run-time environment.

假设你有足够的内存来容纳 68,719,476,735 个元素,但我认为你做不到 :),你可以做一个列表列表:

$hex = [System.Collections.Generic.List[object]]::new()
$tmp = [System.Collections.Generic.List[string]]::new()

for($i = 0xa000000000; $i -le 0xafffffffff; $i++) {
    if($tmp.Count -eq [int]::MaxValue) {
        $hex.Add($tmp)
        $tmp.Clear()
    }
    $tmp.Add($i.ToString('x10'))
}

您可以使用 $i.ToString('x10')'{0:x10}' -f $i 生成 lower-case 十六进制。有关详细信息,请参阅 Hexadecimal format specifier (X)

..range operator 的端点必须符合 [int] 个值,您的数字超过了这个值。

  • 此外,由于您正在尝试将流式传输 0xa000000000..0xafffffffff| % ToString X10 管道命令 的输出完整地收集到内存中 ,方法是将其包含在 (...) 中并在其上调用方法 .ToString(),收集的输出必须适合 数组 ,并且范围内的元素数超过最大值。 .NET array 的容量也是。

同样,不幸的是,[Linq.Enumerable]::Range() 方法也只接受 [int] 个端点。

但是,您可以实施(自定义)解决方案,其中 PowerShell 创建每个格式化数字(字符串)并将其发送到管道 一个接一个:

$num = 0xa000000000
while ($num -le 0xafffffffff) { ($num++).ToString('x10') }

注:

  • 虽然这有效,但会

  • 您将无法将结果作为一个整体捕获到集合内存中.

    • 如果您要将输出流式传输到未过滤的 文件,您最终会得到一个大小为 704 GB(!) / 768 GB(!) 的文件 Unix-like平台/Windows.
    • In-memory,将输出分成小到足以放入数组的块是唯一的选择。