从整数在 Powershell/C# 中创建位数组
Creating Bit Array in Powershell/C# from integers
我正在尝试对游戏数据库进行逆向工程,但遇到了障碍。
我可以加载所有 tables/fields/records ,但是在将记录值转换为十六进制或位时我遇到了困难
值(在游戏中)如下:(15位)192 - (10位)20 - (5位)19 - (5位)2
在 db 文件中,它显示 00 C0 - 00 0A - A6 - 00
这很奇怪,因为在十六进制 (192) 中只有第一个值 (00 C0) 相同
其他值不同,我猜这是因为它们不是完整的字节(分别为 10 位和 5 位)所以它必须使用位数组。
当我将最终值从 2 更改为 31 时,进一步证明了这个猜测。数据库中的最后 2 个值已更改,十六进制字符串变为 00 C0 - 00 0A - E6 - 07
那么在 PowerShell 中将这 4 个整数放入位数组的最佳方法是什么,这样我就可以尝试确定这里发生了什么?如果对任何更有经验的程序员来说这不是显而易见的,那么这里在起作用。如果需要,我也可以使用 C#,但我经验不足。
谢谢
我不确定你想要达到什么目的。 5 位字字面上是奇数。
可能这里没有明确的转换,而是像 hash 这样的东西。无论如何,从技术上讲,您可以从 0
数到 2^35 - 1
并在您的游戏中戳它并在您的数据库中查找结果。
我给大家介绍几个转换方法:
到位数组:
$Bits =
[convert]::ToString(192, 2).PadLeft(15, '0') +
[convert]::ToString( 20, 2).PadLeft(10, '0') +
[convert]::ToString( 19, 2).PadLeft( 5, '0') +
[convert]::ToString( 2, 2).PadLeft( 5, '0')
$Bits
00000001100000000000101001001100010
返回:
if ($Bits -Match '(.{15})(.{10})(.{5})(.{5})') {
$Matches[1..4].Foreach{ [convert]::ToByte($_, 2) }
}
192
20
19
2
到 Int64:
$Int64 = [convert]::ToInt64($Bits, 2)
$Int64
201347682
至字节:
$Bytes = [BitConverter]::GetBytes($Int64)
[System.BitConverter]::ToString($Bytes)
62-52-00-0C-00-00-00-00
注意字节列表是倒序的:
[convert]::ToString(0x62, 2)
1100010
我正在尝试对游戏数据库进行逆向工程,但遇到了障碍。
我可以加载所有 tables/fields/records ,但是在将记录值转换为十六进制或位时我遇到了困难
值(在游戏中)如下:(15位)192 - (10位)20 - (5位)19 - (5位)2
在 db 文件中,它显示 00 C0 - 00 0A - A6 - 00
这很奇怪,因为在十六进制 (192) 中只有第一个值 (00 C0) 相同
其他值不同,我猜这是因为它们不是完整的字节(分别为 10 位和 5 位)所以它必须使用位数组。
当我将最终值从 2 更改为 31 时,进一步证明了这个猜测。数据库中的最后 2 个值已更改,十六进制字符串变为 00 C0 - 00 0A - E6 - 07
那么在 PowerShell 中将这 4 个整数放入位数组的最佳方法是什么,这样我就可以尝试确定这里发生了什么?如果对任何更有经验的程序员来说这不是显而易见的,那么这里在起作用。如果需要,我也可以使用 C#,但我经验不足。
谢谢
我不确定你想要达到什么目的。 5 位字字面上是奇数。
可能这里没有明确的转换,而是像 hash 这样的东西。无论如何,从技术上讲,您可以从 0
数到 2^35 - 1
并在您的游戏中戳它并在您的数据库中查找结果。
我给大家介绍几个转换方法:
到位数组:
$Bits =
[convert]::ToString(192, 2).PadLeft(15, '0') +
[convert]::ToString( 20, 2).PadLeft(10, '0') +
[convert]::ToString( 19, 2).PadLeft( 5, '0') +
[convert]::ToString( 2, 2).PadLeft( 5, '0')
$Bits
00000001100000000000101001001100010
返回:
if ($Bits -Match '(.{15})(.{10})(.{5})(.{5})') {
$Matches[1..4].Foreach{ [convert]::ToByte($_, 2) }
}
192
20
19
2
到 Int64:
$Int64 = [convert]::ToInt64($Bits, 2)
$Int64
201347682
至字节:
$Bytes = [BitConverter]::GetBytes($Int64)
[System.BitConverter]::ToString($Bytes)
62-52-00-0C-00-00-00-00
注意字节列表是倒序的:
[convert]::ToString(0x62, 2)
1100010