V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
kokutou
V2EX  ›  问与答

求问这一小段 c 程序在 Java 里怎么写。。。

  •  
  •   kokutou · 2017-05-13 12:39:25 +08:00 · 1586 次点击
    这是一个创建于 2784 天前的主题,其中的信息可能已经有所发展或是发生改变。

    就是根据情况读取有 1 个、2 个、或者 3 个字节,做些操作,然后得到输出。
    这个输出的意义是个数组长度。

    这段是用 ida 静态分析一个 delphi 程序得到的 c 伪代码。。。
    为啥存个数组长度要存成这样了???
    还是说是某个算法,然后编译器优化成这样了?
    还是说是我想多了,这玩意就是恶心人防破解的?

    输入 0x3d,输出 0x7a
    输入 0x70 0x01,输出 0xe0
    输入 0x76 0xb8 0x21,输出 0x08 0x5c 0x6c

    #include <stdio.h>
    
    int main() {
        unsigned long long i = 0;
        unsigned long long out = 0;
    
        // read 1 bit to i;
        i = 0x76;
        out = i;
        if (i > 0x3f) {
            // read 1 bit to i;
            i = 0xb8;
            out += (i - 1) << 6;
            printf("%lld\n", (i - 1) << 6);
            if (i > 0x7f) {
                // read 1 bit to i;
                i = 0x21;
                out += (i - 1) << 13;
                printf("%lld\n", (i - 1) << 13);
            }
        }
    
        //output*2
        printf("%lld %llx", out * 2, out * 2);
    
        return 0;
    }
    

    下面是截图:

    1 条回复    2017-05-14 12:53:30 +08:00
    kokutou
        1
    kokutou  
    OP
       2017-05-14 12:53:30 +08:00
    java 没有 unsigned,这样搞一下就好了:

    ```
    private static int uByte(byte signedByte) {
    return ((int) signedByte) & 0xff;
    }

    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1171 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 23:15 · PVG 07:15 · LAX 15:15 · JFK 18:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.