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

转载请标明出处: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转为 charBuffer
        Charset 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时,是根据他们显示的形式加入的stirng

        char[] 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));


        //9
        String 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

发布了244 篇原创文章 · 获赞 799 · 访问量 234万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览