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

2020-06-26 16:31:55 +08:00
 appleandbanana

目前有 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);
}

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

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

2121 次点击
所在节点    算法
8 条回复
GuuJiang
2020-06-26 16:51:49 +08:00
这个……基本操作而已,不要激动,另外你给的示例代码是错的,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
2020-06-26 17:29:42 +08:00
为什么只取 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
2020-06-26 17:32:19 +08:00
你这代码乱七八糟还漏了两个 byte,基本的二进制数据处理而已
https://paste.ubuntu.com/p/M8BxW6yy22/
Mohanson
2020-06-26 17:37:32 +08:00
正常 endian 的逻辑,一般直接强制内存类型转换会快很多
Jirajine
2020-06-26 17:39:35 +08:00
不好意思上面写漏了个类型
https://paste.ubuntu.com/p/MBs7JsCjfn/
appleandbanana
2020-06-26 22:57:30 +08:00
@GuuJiang
@ob
@Jirajine
@Mohanson
感谢各位大佬的帮助,这个方法主要不是 bytes 和 long 转换的问题,是他这中间有个貌似混淆的过程,各种或运算、与运算啥的,主要是这块不知道如何逆运算~
Jirajine
2020-06-26 23:14:01 +08:00
@appleandbanana 这有啥混淆的,和 255 ( 0xff )取 &意思是拿到那个最低位的 byte,移位后再|就是拼装起来,相当于相加。
如 b =[0xff,0xee,0xdd,0xcc]
j = 0x000000ff | 0x0000ee00 | 0x00dd0000 | 0xcc000000 = 0xccddeeff
剩下那几位同理
May725
2020-06-27 19:07:51 +08:00
基本的位运算,找一下相关资料就熟悉了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/684880

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX