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,将输出分成小到足以放入数组的块是唯一的选择。
我正在尝试从 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,将输出分成小到足以放入数组的块是唯一的选择。