目前有 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
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; |
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; } ``` |
3
Jirajine 2020-06-26 17:32:19 +08:00 1
你这代码乱七八糟还漏了两个 byte,基本的二进制数据处理而已
https://paste.ubuntu.com/p/M8BxW6yy22/ |
4
Mohanson 2020-06-26 17:37:32 +08:00 via Android 2
正常 endian 的逻辑,一般直接强制内存类型转换会快很多
|
5
Jirajine 2020-06-26 17:39:35 +08:00 1
不好意思上面写漏了个类型
https://paste.ubuntu.com/p/MBs7JsCjfn/ |
6
appleandbanana OP |
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 剩下那几位同理 |
8
May725 2020-06-27 19:07:51 +08:00 via iPhone
基本的位运算,找一下相关资料就熟悉了
|