V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
appleandbanana
V2EX  ›  算法

遇到一神逻辑代码,有偿请教,路过的大佬看一眼啊,多谢~

  •  
  •   appleandbanana · 2020-06-26 16:31:55 +08:00 · 2287 次点击
    这是一个创建于 1611 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有 java 代码一段,能将一个 bytes[]转换成 long,如果想做出代码的逆运算该怎么写,输入一段 long,转换成 bytes[]?

    代码如下:

    public static long byteToLong(byte[] b) {
                long s0 = (long) (b[0] & 255);
                long s1 = (long) (b[1] & 255);
                long s2 = (long) (b[2] & 255);
                long s3 = (long) (b[3] & 255);
                long j = s0 | (s1 << 8) | (s2 << 16) | (s3 << 24);
                return j | (((long) (b[4] & 255)) << 32) | (((long) (b[5] & 255)) << 40);
    }
    

    这一堆位运算看的脑阔疼~

    感谢过路大佬,能帮忙解决的话,三位数红包献上~

    第 1 条附言  ·  2020-06-26 22:55:05 +08:00
    感谢各位大佬的帮助,这个方法主要不是 bytes 和 long 转换的问题,是他这中间有个貌似混淆的过程,各种或运算、与运算啥的,主要是这块不知道如何逆运算~
    8 条回复    2020-06-27 19:07:51 +08:00
    GuuJiang
        1
    GuuJiang  
       2020-06-26 16:51:49 +08:00 via iPhone   ❤️ 1
    这个……基本操作而已,不要激动,另外你给的示例代码是错的,long 对应的 bytes 数组长度为 8,而你这段代码里只用到了 6 位,至于你要的逆运算,我在手机上凭记忆手打一段吧,如有错误,楼下补充
    byte[] bytes = new byte[8];
    for (int i = 0; i < 8; i++) {
    bytes[i] = (value >> (I * 8)) & 0xFF;
    }
    return bytes;
    ob
        2
    ob  
       2020-06-26 17:29:42 +08:00   ❤️ 1
    为什么只取 6 位,代码简单写死了。
    ```java
    public static byte[] longToByte(long l) {
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
    buffer.putLong(l);
    byte[] b = buffer.array();
    byte[] result = new byte[6];
    result[0] = b[7];
    result[1] = b[6];
    result[2] = b[5];
    result[3] = b[4];
    result[4] = b[3];
    result[5] = b[2];
    return result;
    }
    ```
    Jirajine
        3
    Jirajine  
       2020-06-26 17:32:19 +08:00   ❤️ 1
    你这代码乱七八糟还漏了两个 byte,基本的二进制数据处理而已
    https://paste.ubuntu.com/p/M8BxW6yy22/
    Mohanson
        4
    Mohanson  
       2020-06-26 17:37:32 +08:00 via Android   ❤️ 2
    正常 endian 的逻辑,一般直接强制内存类型转换会快很多
    Jirajine
        5
    Jirajine  
       2020-06-26 17:39:35 +08:00   ❤️ 1
    不好意思上面写漏了个类型
    https://paste.ubuntu.com/p/MBs7JsCjfn/
    appleandbanana
        6
    appleandbanana  
    OP
       2020-06-26 22:57:30 +08:00
    @GuuJiang
    @ob
    @Jirajine
    @Mohanson
    感谢各位大佬的帮助,这个方法主要不是 bytes 和 long 转换的问题,是他这中间有个貌似混淆的过程,各种或运算、与运算啥的,主要是这块不知道如何逆运算~
    Jirajine
        7
    Jirajine  
       2020-06-26 23:14:01 +08:00 via Android
    @appleandbanana 这有啥混淆的,和 255 ( 0xff )取 &意思是拿到那个最低位的 byte,移位后再|就是拼装起来,相当于相加。
    如 b =[0xff,0xee,0xdd,0xcc]
    j = 0x000000ff | 0x0000ee00 | 0x00dd0000 | 0xcc000000 = 0xccddeeff
    剩下那几位同理
    May725
        8
    May725  
       2020-06-27 19:07:51 +08:00 via iPhone
    基本的位运算,找一下相关资料就熟悉了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1972 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:24 · PVG 08:24 · LAX 16:24 · JFK 19:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.