微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Powershell/C# 中从整数创建位数组

如何解决在 Powershell/C# 中从整数创建位数组

我正在尝试对游戏数据库进行逆向工程,但遇到了障碍。

我可以加载所有的表/字段/记录,但是在将记录值转换为十六进制或位时我卡住了

数值(游戏中)如下:(15位)192 - (10位)20 - (5位)19 - (5位)2

在db文件中,显示00 C0 - 00 0A - A6 - 00

这很奇怪,因为只有第一个值 (00 C0) 在 Hex (192) 中是相同的

其他值不同,我猜这是因为它们不是完整字节(分别为 10 位和 5 位),所以它必须使用位数组。

当我将最终值从 2 更改为 31 时,进一步证明了这一猜测。db 中的最后 2 个值已更改,十六进制字符串变为 00 C0 - 00 0A - E6 - 07

那么在 PowerShell 中将这 4 个整数放入位数组的最佳方法是什么,以便我可以尝试确定这里发生了什么?如果任何更有经验的程序员都不清楚这里的作用是什么。如果需要,我也可以使用 C#,但我经验不足。

谢谢

解决方法

我不确定您想要达到的目标。 5bits 字从字面上看是奇怪的。 可能是这里没有明确的转换,而是类似于 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,'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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。