一、需求:

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

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

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

三、说明:

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

关于Java实现的进制转化(位运算)的更多相关文章

  1. 【JavaScript】进制转换&位运算,了解一下?

    前言 在一般的代码中很少会接触到进制和位运算,但这不代表我们可以不去学习它.作为一位编程人员,这些都是基础知识.如果你没有学过这方面的知识,也不要慌,接下来的知识并不会很难.本文你将会学习到: 进制转 ...

  2. Python笔记_第一篇_面向过程_第一部分_3.进制、位运算、编码

    通过对内存这一个部分的讲解,对编程会有一个相对深入的认识.数据结构是整个内存的一个重要内容,那么关于数据结构这方面的问题还需要对进制.位运算.编码这三个方面再进行阐述一下.前面说将的数据结构是从逻辑上 ...

  3. C#的格式化(进制转换|位运算)

    1.首先做一下知识的普及C或c Currency 货币格式D或d Decimal 十进制格式E或e Exponent 指数格式F或f Fixed point (float)固定精度格式G或g Gene ...

  4. javascript中的类型转换(进制转换|位运算)

    1:parseInt(string) : 这个函数的功能是从string的开头开始解析,返回一个整数 parseInt("123hua"); //输出 123 parseInt(& ...

  5. 4.Python 进制和位运算

    .button, #logout { color: #333; background-color: #fff; border-color: #ccc; } span#login_widget > ...

  6. Codeforces Round #299 (Div. 2) B. Tavas and SaDDas【DFS/*进制思维/位运算/一个数为幸运数,当且仅当它的每一位要么是4,要么是7 ,求小于等于n的幸运数个数】

    B. Tavas and SaDDas time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

  8. java中的进制转换方法

    java中进行二进制,八进制,十六进制,十进制间进行相互转换 关键字: java 进制转换 十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer ...

  9. HDU5050:Divided Land(大数的进制转化与GCD)

    题意:给定大数A和B,求gcd.所有数字都是二进制. 思路:先输入字符串,再转化为大数,然后用大数的gcd函数,最后转化为字符串输出. 利用字符串和大数转化的时候可以声明进制,就很舒服的完成了进制转化 ...

随机推荐

  1. Stanford CS231n实践笔记(课时14卷积神经网络详解 上)

    本课我们主要来研究一个"浏览器中的卷积神经网络" 这只是一个展示项目,但是能够帮助直观地看到一些东西 地址:https://cs.stanford.edu/people/karpa ...

  2. 简单的MVC与SQL Server Express LocalDB

    M模式: 类,表示数据的应用程序和使用验证逻辑以强制实施针对这些数据的业务规则. V视图: 应用程序使用动态生成 HTML 响应的模板文件. C控制器: 处理传入的浏览器请求的类中检索模型数据,然后指 ...

  3. Codeforces 834D The Bakery - 动态规划 - 线段树

    Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...

  4. topcoder srm 410 div1

    problem1 link 不包含$gridConnections$ 的联通块一定是连在所有包含$gridConnections$的联通块中最大的那一块上. import java.util.*; i ...

  5. Android灯光系统--通知灯深入分析【转】

    本文转自:https://www.cnblogs.com/lkq1220/p/6406261.html Android灯光系统--通知灯深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 ...

  6. 41. 包含min函数的栈

    包含min函数的栈 描述 设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈. push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 ...

  7. 彻底地/ 终于地, 解决 关于apache 权限的问题了:: 修改 DocumentRoot后的 403错误: have no permission to access / on this server

    目录的权限都 应该设置 为 drwxr_xr_x, 即755, 而html下的文件的权限设置为; 644 即可! -x 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性. -w权限, ...

  8. vs 附加进程 iis进程显示

  9. Summary on Visual Tracking: Paper List, Benchmarks and Top Groups

    Summary on Visual Tracking: Paper List, Benchmarks and Top Groups 2018-07-26 10:32:15 This blog is c ...

  10. 谷歌大规模机器学习:模型训练、特征工程和算法选择 (32PPT下载)

    本文转自:http://mp.weixin.qq.com/s/Xe3g2OSkE3BpIC2wdt5J-A 谷歌大规模机器学习:模型训练.特征工程和算法选择 (32PPT下载) 2017-01-26  ...