一、需求:

最近在做文件传输的东西,文件传输当然是传输很重要,包括编码格式以及进制的统一。

简略的说一下这次做的东西:首先文件是按照块来发送的,一块一块大的发,但是,发送的过程是这样的;

先发送头部,头部包括三部分: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;
} }

三、说明:

位运算是比较凶悍的,计算精简。但是不容易理解,根据上述的注释,若有错误或者迷惑,欢迎指正。

最新文章

  1. Myeclipse开发环境下文件中出现的提示错误与解决方法:The import javax.servlet cannot be resolved?
  2. Java设计模式 - 观察者模式
  3. JS和JQuery总结
  4. html5 canvas 粒子特效
  5. DPDK内存管理-----(一)初始化
  6. 分布式文件系统-HDFS
  7. 日志分析(三) kibana数据展示
  8. STC12C5A60S2片内存储器介绍
  9. underscorejs-size学习
  10. MVC验证08-jQuery异步验证
  11. PHP中file_exists与is_file、is_dir的区别,以及执行效率的比较
  12. 【原创】Linux基础之挂载硬盘
  13. Docker应用场景
  14. Windows could not set the offline local information.Error code:0X80000001解决方法
  15. Cocos2d-x 2.x 升级为 3.x 常见变化纪录
  16. volatile并不能保证数据同步、只能保证读取到最新主内存数据
  17. 原码、反码、补码及位操作符,C语言位操作
  18. p2p网络中的NAT穿透技术----常见NAT穿越解决方案
  19. Unity Shader-GodRay,体积光(BillBoard,Volume Shadow,Raidal Blur,Ray-Marching)
  20. JQuery 双击动态编辑

热门文章

  1. ldap集成jenkins
  2. [BeiJing wc2012]冻结 题解
  3. JS、JAVA刷题和C刷题的一个很重要的区别
  4. C语言实现随机生成0~100的数
  5. 為什麼gnome-terminal中不能使用ctrl_shift_f來進行查找? 是因為 跟输入法的全局设置衝突了!
  6. 关于#ifdef #ifndef
  7. SCU 4445 Right turn(dfs)题解
  8. SpringBoot2.0之整合Apollo
  9. Directional RNA-seq data -which parameters to choose?
  10. How to Install Apache Tomcat 8.5 on CentOS 7.3