关于Java实现的进制转化(位运算)
2024-10-18 21:24:24
一、需求:
最近在做文件传输的东西,文件传输当然是传输很重要,包括编码格式以及进制的统一。
简略的说一下这次做的东西:首先文件是按照块来发送的,一块一块大的发,但是,发送的过程是这样的;
先发送头部,头部包括三部分:1.一个int类型的文件Id,
2.一个long类型的偏移量,因为是块发,当然需要知道每次发送的起始位置。
3.一个int类型的文件长度。
而我们知道,文件传输可以是文件流的形式。但是是以二进制传输的,所以就牵扯到了int<->二进制和long<->二进制的需求。
二、具体的代码实现:
package com.xupt.until; public class ByteAndString { private static final String hex = "0123456789ABCDEF"; //字符串将由下面找到的对应 public static String toHex(byte[] buffer) { //类型为byte的数组 有下标
StringBuffer result = new StringBuffer(); for(int i = 0;i < buffer.length;i++) {
byte bv = buffer[i];
result.append(i == 0 ? "" : ' ')
/* 这个方法将二进制的形式转换成字符串的“十六进制”。这是前四位
右移四位后变成后四位,对应的数字找hex(用下标找)。
比如:
1010 0010 对应的是先右移四位1010到后四位,与00FF相与就是
0000 0000 0000 1010与0000 0000 1111 1111相与是1010对应十进制是10在hex中找
因此它是A
*/
.append(hex.charAt((bv >> 4) & 0x0F))
/*这是后四位和上面的过程一样,只是不用移位*/
.append(hex.charAt(bv & 0x0F));
}
return result.toString();
} //这是将int类型得转化成二进制类型的,高低低高的形式
public static void setIntAt(byte[] buffer,int offset,int value) {
//int是4字节的,即有32位,八位八位一处理。
//int类型的前八位即高位先右移到最后八位即低位和00FF相与得到其本身的放进buffer的0为即低位,高低
buffer[offset + 0] = (byte) ((value >> 24) & 0x00FF);
buffer[offset + 1] = (byte) ((value >> 16) & 0x00FF);
buffer[offset + 2] = (byte) ((value >> 8) & 0x00FF);
buffer[offset + 3] = (byte) (value & 0x00FF);
} //这是将long的类型转化成二进制的方法
public static void setLongAt(byte[] buffer,int offset,long value) {
//long是8字节的,即有64位,八位八位一处理。
//long类型的前八位即高位先右移到最后八位即低位和00FF相与得到其本身的放进buffer的0为即低位,高低
buffer[offset + 0] = (byte) ((value >> 56) & 0x00FF);
buffer[offset + 1] = (byte) ((value >> 48) & 0x00FF);
buffer[offset + 2] = (byte) ((value >> 40) & 0x00FF);
buffer[offset + 3] = (byte) ((value >> 32) & 0x00FF);
buffer[offset + 4] = (byte) ((value >> 24) & 0x00FF);
buffer[offset + 5] = (byte) ((value >> 16) & 0x00FF);
buffer[offset + 6] = (byte) ((value >> 8) & 0x00FF);
buffer[offset + 7] = (byte) (value & 0x00FF);
} //这是将二进制转化成int类型的方法
public static int getIntAt(byte[] buffer,int offset) {
int value = 0;
//第一个value和上面的int类型转化成二进制对应起来,
//先将第一个取出来的左移24位与FF000000相与就是这八位,再相或就是原来的前八位
value |= buffer[offset + 0] << 24 & 0xFF000000;
value |= buffer[offset + 1] << 16 & 0x00FF0000;
value |= buffer[offset + 2] << 8 & 0x0000FF00;
value |= buffer[offset + 3] & 0x000000FF; return value;
} //这是将二进制转化成long类型的方法
public static long getLongAt(byte[] buffer,int offset) {
long value = 0;
//第一个value和上面的long类型转化成二进制对应起来,
//先将第一个取出来的左移64位与FF000000相与就是这八位,再相或就是原来的前八位
value |= buffer[offset + 0] << 56 & 0xFF00000000000000L;
value |= buffer[offset + 1] << 48 & 0x00FF000000000000L;
value |= buffer[offset + 2] << 40 & 0x0000FF0000000000L;
value |= buffer[offset + 3] << 32 & 0x000000FF00000000L;
value |= buffer[offset + 4] << 24 & 0x00000000FF000000L;
value |= buffer[offset + 5] << 16 & 0x0000000000FF0000L;
value |= buffer[offset + 6] << 8 & 0x0000000000000FF0L;
value |= buffer[offset + 7] & 0x00000000000000FFL; return value;
} }
三、说明:
位运算是比较凶悍的,计算精简。但是不容易理解,根据上述的注释,若有错误或者迷惑,欢迎指正。
最新文章
- Myeclipse开发环境下文件中出现的提示错误与解决方法:The import javax.servlet cannot be resolved?
- Java设计模式 - 观察者模式
- JS和JQuery总结
- html5 canvas 粒子特效
- DPDK内存管理-----(一)初始化
- 分布式文件系统-HDFS
- 日志分析(三) kibana数据展示
- STC12C5A60S2片内存储器介绍
- underscorejs-size学习
- MVC验证08-jQuery异步验证
- PHP中file_exists与is_file、is_dir的区别,以及执行效率的比较
- 【原创】Linux基础之挂载硬盘
- Docker应用场景
- Windows could not set the offline local information.Error code:0X80000001解决方法
- Cocos2d-x 2.x 升级为 3.x 常见变化纪录
- volatile并不能保证数据同步、只能保证读取到最新主内存数据
- 原码、反码、补码及位操作符,C语言位操作
- p2p网络中的NAT穿透技术----常见NAT穿越解决方案
- Unity Shader-GodRay,体积光(BillBoard,Volume Shadow,Raidal Blur,Ray-Marching)
- JQuery 双击动态编辑
热门文章
- ldap集成jenkins
- [BeiJing wc2012]冻结 题解
- JS、JAVA刷题和C刷题的一个很重要的区别
- C语言实现随机生成0~100的数
- 為什麼gnome-terminal中不能使用ctrl_shift_f來進行查找? 是因為 跟输入法的全局设置衝突了!
- 关于#ifdef #ifndef
- SCU 4445 Right turn(dfs)题解
- SpringBoot2.0之整合Apollo
- Directional RNA-seq data -which parameters to choose?
- How to Install Apache Tomcat 8.5 on CentOS 7.3