转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51743969 文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货!

常用的编码方式有Unicode、ASCII、UTF-8、GB2312、ISO-8899-1等。采用不同的编码方式,同样的n位二进制“数字”组合代表的“字符”也会不一样。具体采用什么样的编码方式,对“字符”怎样解析,就要看编程所在的平台是什么样了。同时,为了方便,我们并不会直接用n位二进制的表示,而是用它的十六进制表示。

八种基本数据类型:

数据类型 名称 长度 备注
byte 字节型 1字节 = 8bit 表示数据范围:-128~127
short 短整型 2字节 = 16bit
char 字符型 2字节 = 16bit 等价于Unicode编码
int 整型 4字节 = 32bit
long 长整型 8字节
float 单精度浮点型 4字节 精度:7-8位
double 双精度浮点型 8字节
boolean 布尔型 true/false

各数据之间转化:

1.String<—>byte[]

1.1 String—>byte[]

byte[] bytes = mString.getBytes();

String默认使用utf-8编码,将mString中的二进制(使用utf-8编码后的二进制),每个字节存储在bytes中。

例如: mString中的 值:’タ’ 65408 被转为 bytes 中的 -17, -66 ,-128

65408 对应二进制 1111 1111 1000 0000,这个数据使用utf-8编码后的二进制为:1110 1111 1011 1110 1000 0000,对应- 17,-66, -128

关于编码,可以查看我的这篇博客

1.2 byte[]—>String

//1、默认使用utf-8编码
String String1 = new String(bytes);//2、指定其他编码方式
String String2 = new String(bytes, StandardCharsets.US_ASCII);
String String21 = new String(bytes, StandardCharsets.ISO_8859_1);
  • 可以指定byte[]—>String使用的编码类型
  • String一个字符是16bit,转化时对byte (8bit)进行符号扩展
  • 使用默认的utf-8编码时,如果byte的二进制数据不符合utf-8编码规范,则转化后 String对应的字符为’�’ 65533

2.String<—>char[]

2.1、String—>char[]

String s = "SSSSSSS";
char[] ss = s.toCharArray();

2.2、char[]—>String

 char[] chars4 = {0x0001, 0xfff0, 0xf0, 'a', 0x4E25};String string4 = new String(chars4);
  • char也是使用utf-8编码,如果char的二进制数据不符合utf-8编码规范,用户看到的字符为空。
  • 因为char已经是字符,所以直接把字符赋给String 。

3.String<—>int

3.1、String—>int

String string9 = "严";
int i9 = Integer.parseInt(string9);

Exception in thread “main” java.lang.NumberFormatException: For input string: “严”

如果String 不是数据,会抛出异常

3.2、int—>String

int i = 10;
//转化
String string9 = String.valueOf(i);
//2、直接使用字符串加上i,java会自动转化
string9 = "" + i;

4.String<—>char

4.1、String—>char

String string = "严";
char char = string.charAt(0);

4.2、char—>String

char char1 = a;
//转化
String string9 = String.valueOf(char1);
//2、直接使用字符串加上i,java会自动转化
string9 = "" + char1;

5.String<—>byte

5.1、String—>byte

可以先转为String—>byte[],在取出其中的byte

5.1、byte—>String

byte byte1 = 0xff;
//转化
String string9 = String.valueOf(byte1);
//2、直接使用字符串加上i,java会自动转化,string9 内容为 -1
string9 = "" + byte1;

注意:byte是未经过编码的二进制数据,所以在直接转为String 时,用户看到的是二进制对应的十进制数值

6.int<—>char<—>byte

public static void main(String[] args) {byte b=-1;System.out.println((int)(char)b);System.out.println((int)(char)(b & 0xff));
}

运行结果是:65535和255

如果你对输出结果感到很惊讶,请继续往下读…

1、 int(32位) -> byte(8位)

-1是int型的字面量,根据“2的补码”编码规则,编码结果为0xffffffff,即32位全部置1.转换成byte类型时,直接截取最后8位,所以byte结果为0xff,对应的十进制值是-1.

2、 byte(8位) -> char(16位)

由于byte是有符号类型,所以在转换成char型(16位)时需要进行符号扩展,即在0xff左边连续补上8个1(1是0xff的符号位),结果是0xffff。由于char是无符号类型,所以0xffff表示的十进制数是65535。

3、 char(16位) -> int(32位)

由于char是无符号类型,转换成int型时进行零扩展,即在0xffff左边连续补上16个0,结果是0x0000ffff,对应的十进制数是65535。

4、 int(32位) -> char(16位)

char c = (char)(b & 0xff);

(b & 0xff)的结果是32位的int类型,前24被强制置0,后8位保持不变,然后转换成char型时,直接截取后16位。最后结果为0x00ff

5、 char 与 int 进行运算

int i = c & 0xffff;

0xffff是int型字面量,所以在进行&操作之前,编译器会自动将c转型成int型,即在c的二进制编码前添加16个0,然后再和0xffff进行&操作,所表达的意图是强制将前16置0,后16位保持不变。虽然这个操作不是必须的,但是明确表达了不进行符号扩展的意图。

如果需要符号扩展,则可以如下编码:

int i = (short)c; //Cast causes sign extension

首先将c转换成short类型,它和char是 等宽度的,并且是有符号类型,再将short类型转换成int类型时,会自动进行符号扩展,即如果short为负数,则在左边补上16个1,否则补上16个0.

Java中数据转化的一些规则:

  1. 如果二进制不符合utf-8的规则,在String 中就会被赋值为65533(对应的二进制)
  2. byte是未经编码的二进制数据,在java中可以对byte来进行各种编码。
  3. 在基本数据类型中,存储的都是二进制数据,只是在显示的时候显示各自不同的类型。例如:char保存的二进制数据显示出来是使用编码utf-8后的符号,其它基本数据类型显示出来都是数字。
  4. 基本数据类型转String,方式多样化,

    • 直接相加,
    • String.valueOf()
  5. byte、int、short之间不会互相转换,因为容量小的数据类型会自动转换为大的数据类型,所以在运算时,它们都会被转换为int型

  6. 容量大的数据类型转换成容量小的数据类型时,要加上强制转换符,但可能会造成精度降低或数据溢出
  7. String不属于Java的基本数据类型,String的本质是字符数组,是类对象

我在进行测试时的代码:

public class MyClass {public static void main(String[] args) {//byte---> string//byte是未经过编码的原始数据,转为string时可以选择编码格式byte[] bytes = {0x1f, (byte) 0x7f, (byte) 0xdf80, (byte) 0x80};
//        byte[] packetHeard = {(byte)'\u0080',(byte)'\u0001',(byte)'\u007f',(byte)'\u00ff',(byte)'\u00BA',(byte)'\u00CF'};//1、默认使用utf-8编码String String1 = new String(bytes);//2、指定其他编码方式String String2 = new String(bytes, StandardCharsets.US_ASCII);String String21 = new String(bytes, StandardCharsets.ISO_8859_1);//3、使用指定的编码,把bytes转为 charBufferCharset charSet = Charset.forName("Unicode");ByteBuffer byteBuffer = ByteBuffer.allocate(bytes.length);byteBuffer.put(bytes);byteBuffer.flip();CharBuffer charBuffer = charSet.decode(byteBuffer);//4、直接使用tostring(),并不能转为字符串String String3 = bytes.toString();int i = bytes.hashCode();String string31 = Integer.toHexString(i);//5、使用char[] 初始化string,char(显示是utf-8),所以这里直接使用了这些字符//char、int、short等基本类型的数据,都可以直接用二进制赋值,只是在显示的时候显示各自不同的。例如char显示的是使用编码utf-8后的符号//而把这些数据类型转化为string时,是根据他们显示的形式加入的stirngchar[] chars4 = {0x0001, 0xfff0, 0x80, 'a', 0x4E25};short short4 = (short) 0xfff0;String string4 = new String(chars4);string4 = String.valueOf(short4);//6、string  相加,都会保留原来数据属性(数字就是数字,字符就是字符),可以试着把(char)变为(int)等String string5 = "";for (i = 0; i < bytes.length; i++) {string5 += (char) bytes[i];}//string-->byte//7、默认utf-8编码,将string5中的二进制(使用utf-8编码后的二进制),每个字节存储在bytes6中byte[] bytes6 = string5.getBytes();//这个所得结果暂时搞不懂charSet = Charset.forName("ASCII");bytes6 = string4.getBytes(charSet);byte[] b = new byte[2];b[0] = (byte) ((chars4[4] & 0xFF00) >> 8);b[1] = (byte) (chars4[4] & 0xFF);//8、byte b8 = -1;System.out.println((int) (char) b8);System.out.println((int) (char) (b8 & 0xff));//9String string9 = "严";int i9 = 0xFFFFFFFF;string9 = string5 + i9;char char9 = string9.charAt(0);}
}

参考:

http://m.blog.csdn.net/article/details?id=47956891
http://blog.csdn.net/Player26/article/details/3346936
http://my.oschina.net/joymufeng/blog/139952
http://www.mytju.com/classcode/tools/encode_utf8.asp
http://blog.sina.com.cn/s/blog_6047c8870100qftt.html
http://www.jianshu.com/p/17e771cb34aa
http://m.blog.csdn.net/article/details?id=49783345

Java中的byte[]/char[]/int/String数据类型转换相关推荐

  1. Java中:byte转换为int ,int转换为long

    1.byte转换为int 在Java语言中,byte 和 int都是有符号的,它们的数值都是用补码做计算的. byte的数值范围是:-128 ~ +127 .高位为1表示负数,0表示正数. 如果在业务 ...

  2. Java中如何实现Date与String之间的数据类型转换

    String 数据类型转换成 Date String inputDate = "2021-04-11";Date outputDate = null;SimpleDateForma ...

  3. Java中的byte详解

    Java中的byte详解 介绍 byte,即字节,由8位的二进制组成.在Java中,byte类型的数据是8位带符号的二进制数. 在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在 ...

  4. byte java byte_详解java中的byte类型

    Java中整数类型有:byte占8位, short 占16位, int占32位, long占64位 Java也提供了一个byte数据类型,并且是基本类型中的整数类型.java byte是作为最小的数字 ...

  5. byte java 详解_详解java中的byte类型

    Java也提供了一个byte数据类型,并且是基本类型.java byte是做为最小的数字来处理的,因此它的值域被定义为-128~127,也就是signed byte.下面这篇文章主要给大家介绍了关于j ...

  6. JAVA学习脚印10:解惑java 中UTF-16与char

    JAVA学习脚印10:解惑java 中UTF-16与char java中的char.utf-16编码.代码点.代码单元等概念,做一个了解还是有必要的. 1.基本概念 1) Java的字符类型和字符串类 ...

  7. java中的byte

    8 bit (位) = 1 Byte (字节) java中的byte就是Byte 1024 Byte = 1KB 1024 KB = 1MB 1:"字节"是byte,"位 ...

  8. Java中的byte类型是有符号的吗_JAVA中byte类型的介绍。 谢谢

    展开全部 Java也提供62616964757a686964616fe59b9ee7ad9431333431366265了一个byte数据类型,并且是基本类型.java byte是做为最小的数字来处理 ...

  9. java判断float相等_在java中判断两个浮点型(float)数据是否相等的案例

    示例代码: public static void main(String[] args) { float a = 10.222222225f; float b = 10.222222229f; Sys ...

最新文章

  1. 2021年ML和NLP研究亮点回顾 | DeepMind科学家Sebastian Ruder
  2. CRM/PLM/SCM/MES与ERP的联系与区别
  3. php实现数值的整数次方
  4. Spring Framework 核心原理与源码解析-大纲
  5. android的fragment讲解
  6. 华为云大数据存储的冗余方式是三副本_揭秘!10+位DBA大神测评华为云DDS增强版实感...
  7. Laravel项目问题集锦
  8. 用友nc java_用友NC系统使用过程中常见问题和解决方法!收藏!
  9. Zipf齐夫分布及Java实现
  10. python3爬虫系列09之爬虫数据存入MySQL数据库
  11. 将Table数据记录生成表格图片
  12. c语言中字符串变量怎么定义,字符串变量是什么意思
  13. YYC松鼠短视频系统完整版的文件结构目录介绍以及自定义目录详解
  14. python实战|python爬取58同城租房数据并以Excel文件格式保存到本地
  15. 好听的音乐---飛魚樂園音樂專輯(Orchid Island)
  16. 携手独角兽企业,微软正在用AI打造更美好的未来
  17. 环保公司网站的设计与制作
  18. 红宝书背诵笔记 — 简单基础词语,Java视频教程百度网盘
  19. java 内存很高_Java服务器内存和CPU占用过高的原因
  20. 倾斜模型精细化处理_无人机倾斜摄影技术的三维精细模型制作

热门文章

  1. 安全需求规范和管理指南
  2. Viewpage使用
  3. Lesson 1. 线性回归模型的一般实现形式
  4. EtcGame华丽升级为Coingame 新增ETH投注!
  5. C 中用语言描述出下述方法的功能,文献检索复习题A
  6. usb声卡驱动(六):usb声卡中的pcm打开和关闭
  7. 枚举---枚举的其他应用
  8. ERP编制物料清单 基础
  9. 嵌入式计算机的分类与应用
  10. android usb 从模式切换,android5.1-在系统设置里添加设置选项 以及 USB-OTG 模式切换...