【问题标题】:Creating Bit Array in Powershell/C# from integers在 Powershell/C# 中从整数创建位数组
【发布时间】:2021-10-06 13:43:35
【问题描述】:

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

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

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

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

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

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

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

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

谢谢

【问题讨论】:

    标签: c# .net powershell bitarray


    【解决方案1】:

    我不确定你想要实现什么。 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
    

    【讨论】:

    • 我很确定它们不是 hash ,但是你给了我我想要的命令。应该能够进行一些试验和错误并解决它。谢谢老哥
    猜你喜欢
    • 1970-01-01
    • 2016-07-17
    • 2021-01-15
    • 2012-11-26
    • 2016-10-24
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多