1、byte转换为16进制字符串:

1) 通过Integer.toHexString()方法

public static String bytesToHexString(byte[] src){

StringBuilder hexResult=new StringBuilder("");

if(src==null||src.length==0)

return null;

for(int i=0;i

String hex=Integer.toHexString(src[i]&0xFF);

if(hex.length()<2){

hexResult.append("0");

}

hexResult.append(hex);

}

return hexResult.toString();

}

注意这里 b[i] & 0xFF 将一个byte与0xFF进行了与运算,其运算结果仍然是个int,那么为何要和 0xFF 进行运算?

直接 Integer.toHexString(b[i]),将 byte 强转为 int 不行吗? 答案是不行的。

原因在于:java中负整数的二进制采用补码形式,byte的大小为8bit,int大小为32bit,byte转化为int时会进行补位

如:byte类型 -1 的补码为 11111111,转化为int时补位成 11111111,11111111,11111111,11111111 即0xFFFFFFFF

0xFF 默认为int类型,byte & 0xFF 会先将byte转化为int类型,这样结果中的高24bit就会被清0,结果为0xFF

另:补码 = 反码 + 1 ,补码的思想为溢出最高位,如: 1+(-1)= 0 ,00000001 & 11111111 = 1,00000000 即 0

2) 取出字节的高四位与低四位分别转化

public static String byteToHexString(byte b){

String map="0123456789ABCDEF";

return map.charAt((b>>4)&0x0F) +""+ map.charAt(b&0x0F);

}

2、字节流 & 字符流

Java的字符内存表现形式为Unicode编码, char 类型为16bit

InputStream 和 OutputStream 类处理的是字节流,数据流中的最小单位是字节(8个bit)

Reader 与 Writer处理的是字符流,在处理字符流时涉及了字符编码的转换问题

Reader 类能够将输入流中采用其他编码的字符转换为Unicode编码,并读入内存

Writer  类能够将内存中的Unicode字符转换为其他编码类型,并写到输出流中

import java.io.*;

public class Test {

private static void readBuff(byte[] buff) throws IOException{

ByteArrayInputStream in=new ByteArrayInputStream(buff);

int data;

while((data=in.read())!=-1){

System.out.print(byteToHexString((byte)data)+" ");

}

System.out.println();

in.close();

}

public static void main(String[] args) throws IOException{

System.out.println("内存中采用unicode字符编码:");

char c='好';

byte lowBit=(byte)(c&0xFF);

byte highBit=(byte)((c>>8)&0xFF);

System.out.println(byteToHexString(lowBit)+" "+byteToHexString(highBit));

String s="好";

System.out.println("本地操作系统默认字符编码:");

readBuff(s.getBytes());

System.out.println("采用GBK字符编码:");

readBuff(s.getBytes("GBK"));

System.out.println("采用UTF-8字符编码:");

readBuff(s.getBytes("UTF-8"));

}

private static String byteToHexString(byte b){

String map="0123456789ABCDEF";

return map.charAt((0xF0&b)>>4) +""+ map.charAt(0x0F&b);

}

}

运行结果:

InputStreamReader - Demo :

import java.io.*;

public class Test {

public static void main(String[] args) throws Exception {

try {

createFile("text",null);

readFile("text",null);

createFile("text_GBK","GBK");

readFile("text_GBK","GBK");

createFile("text_UTF8","UTF-8");

readFile("text_UTF8","UTF-8");

} catch (FileNotFoundException e1) {

} catch (IOException e2) {

}

}

private static String byteToHexString(byte b) {

String map = "0123456789ABCDEF";

return map.charAt((0xF0 & b) >> 4) + "" + map.charAt(0x0F & b);

}

private static void readFile(String fileName,String encoding) throws Exception {

InputStreamReader reader = null;

// 使用InputStreamReader记得指定字符编码,不指定字符编码都是危险的做法,因为不同机器不同系统上的默认编码可能不同

reader = new InputStreamReader(new FileInputStream(new File(fileName)),encoding==null?"GBK":encoding);

System.out.println("file encoding:" + reader.getEncoding());

int data = -1;

while ((data = reader.read()) != -1) {

System.out.println(Integer.toHexString(data));

}

System.out.println();

if (reader != null)

reader.close();

}

private static void createFile(String fileName,String type) throws Exception {

File file = new File(fileName);

FileOutputStream out = null;

if (!file.exists()) {

file.createNewFile();

}

out = new FileOutputStream(file);

String s = "你好";

if(type==null){

for(int i=0;i

char c=s.charAt(i);

out.write((byte)((c>>8)&0xFF));

out.write((byte)(c&0xFF));

}

}else if(type.equals("GBK")){

out.write(s.getBytes(type));

}else if(type.equals("UTF-8")){

out.write(s.getBytes(type));

}

if (out != null)

out.close();

}

}

运行结果:

使用BZ小工具查看各文件内容:

text     : 4F 60 59 7D

text_GBK  : C4 E3 BA C3

text_UTF8   : E4 BD A0 E5 A5 BD

使用nodepad++ 将text_UTF8转为UTF-8编码格式,文件内容为:EF BB BF E4 BD A0 E5 A5 BD , 读取为 feff 4f60 597d

如果 text_UTF8 以 GBK 编码格式进行读取,获取到字符序列为:6d63 72b2 30bd (即乱码)

使用 InputStreamReader/OutputStreamWriter 记得指定字符编码,因为不同机器不同系统上的默认编码可能不同,即使你非常肯定就是要用默认编码,也要显式地指定使用默认编码

字节流是最基本的,所有的InputStream和OutputStream的子类主要用在处理二进制数据,它是按字节来处理的

但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化

这两个之间通过InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联

在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的

在从字节流转化为字符流时,实际上就是byte[]转化为String时, public String(byte bytes[], String charsetName)

在从字符流转化为字节流时,实际上是String转化为byte[]时, byte[] String.getBytes(String charsetName)

默认字符集编码为操作系统字符编码

3、参考链接:

java 0x0f_Java - 字节 字符相关推荐

  1. java 4字节字符_java 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案

    /** * 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案

  2. [Java基础]字节,字符打印流

    代码如下: package PrintWriterPack;import java.io.FileNotFoundException; import java.io.PrintWriter;publi ...

  3. Java IO: 字节和字符数组

    转载自   Java IO: 字节和字符数组 译文链接  作者: Jakob Jenkov   译者:homesick 内容列表 从InputStream或者Reader中读入数组 从OutputSt ...

  4. java字符流实际上也是字节,[Java教程]Java字节流与字符流的区别

    [Java教程]Java字节流与字符流的区别 0 2017-05-22 12:00:42 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身 ...

  5. java字节字符_java按字节截取带有汉字的字符串的解法(推荐)

    由于接口使用的oracle字段长度为固定字节数,然后传进来的字符串估计比数据库字段的总字节数要大,那么截取小于数据库字节数的字符串. 自己参考网上的例子,整了个递归调用就可以了,因为截取的字符字节长度 ...

  6. 字符和字节详解、Java中字节串和字符串相互转换

    字符.字节和编码 1. 程序中的字符与字节 字节是规定存储大小的存储单位,规定为8位一字节(8bit = 1 byte). 字符是人类的描述符号.存储在计算机时,不同的编码格式会有不同的字节组合,一般 ...

  7. 1.8 Java字节流和字符流的区别,如何区分输入流和输出流?

    Java字节流和字符流的区别 首先我们先大概总结一下前面学习的内容,可分为以下几点: 以 Stream 结尾都是字节流,Reader 和 Writer 结尾都是字符流. InputStream 是所有 ...

  8. java 类型 字节_Java数据类型-字节

    .- Java数据类型 强类型语言 要求变量的使用严格符合规定,所有变量都必须先定义后才能使用 弱类型语言 java的数据类型分为两大类 基本类型(primitive type) 基本数据类型 数值类 ...

  9. java保留想要的字符,反转Java中的字符,同时保留一些字符 - java

    我有一个字符串,想要反转它,以便某些字符反转,而其他字符保留在原位.我该如何实现(例如,假设所有数字都留在原处时我希望所有字母都颠倒过来)? 参考方案 您可以为其创建一个自动机: 遍历字符串,将每个字 ...

最新文章

  1. deeplearning模型量化实战
  2. 《简明电路分析》——1.6节简单电路分析实例
  3. 移动应用性能测试白皮书
  4. docker镜像制作(一)
  5. anaconda和python有什么不一样_黄山毛峰的味道为什么会不一样?
  6. 测试连接oracle数据库耗时
  7. HTML块,含样式的标签
  8. OpenShift 4 - 安装部署 Ansible Automation Platform 4.x 控制台
  9. Swift iOS : 代码分析DrawController
  10. 写了一段VBA代码后, Excel每次保存时都弹出警告:”此文档中包含宏、Activex控件、XML扩展包信息“(office 2007)
  11. 2018-06-13 pymssql 访问 SQL Server 2017 或 pyodbc 访问支持 ODBC 的数据库
  12. 1t硬盘怎么分区最好_新买的固态硬盘该不该分区?分区后性能如何?真是后悔知道晚了!...
  13. [lammps教程]OVITO绘制原子运动轨迹线
  14. linux下添加三菱触摸屏usb驱动,[转载]三菱触摸屏GT Works3和PLC GX Works2编程软件下载...
  15. netron可以下载某一层的权重
  16. 微信文件夹的dat文件怎么打开_微信文件夹里的照片文件是DAT格式怎么才能打开?...
  17. hdu 1862 EXCEL排序
  18. 剖析矩阵的本质及其意义
  19. WiFi万能钥匙+小米手机拿到coffee店WiFi密码
  20. 猿创征文|Python基础——Visual Studio版本——第五章 文件I/O

热门文章

  1. Spring内部bean实例
  2. gcc - lm的含义
  3. JMeter入门教程(自己做测试了)
  4. Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差别
  5. git commit Please tell me who you are it config --global user.email you@example.com
  6. dubbo web工程示例_带有Dubbo的Spring Cloud Alibaba
  7. 使用轮转算法求时间片_彩票调度算法,让进程们拼手气? --当操作系统遇上随机算法...
  8. CRMEB支付状态未改变
  9. PHP中的 fastcgi_finish_request();
  10. java 中jtextfield访问限制_java.swing JtextField 中怎么限制只能输入数字