1. 程式人生 > >java byte/char/string/int之間的轉化

java byte/char/string/int之間的轉化

你也可以檢視我的其他同類文章,也會讓你有一定的收貨!

常用的編碼方式有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);

    }
}

參考:

相關推薦

java byte/char/string/int之間轉化

你也可以檢視我的其他同類文章,也會讓你有一定的收貨!常用的編碼方式有Unicode、ASCII、UTF-8、GB2312、ISO-8899-1等。採用不同的編碼方式,同樣的n位二進位制“數字”組合代表的“字元”也會不一樣。具體採用什麼樣的編碼方式,對“字元”怎樣解析,就要看程式設計所在的平臺是什麼樣了。同時,

Javacharint之間的轉換

1、int 轉換成char:                 int  n = 1;                 char ch = (char)(n + '0');                 這樣打印出來ch的值為1;                 不過需要注

Javabyte[]陣列和int之間的轉換

在最近的專案中需要用到byte[]和int互轉,找了一些資料選了其中感覺蠻不錯的一種解決方法記錄一下。 int轉byte[] /** * 將int數值轉換為佔四個位元組的byte陣列,本方法適用於(低位在前,高位在後)的順序。 和

java 徹底理解 byte char short int float long double (轉)

遇到過很多關於 數值類型範圍的問題了,在這做一個總結,我們可以從多方面理解不同數值型別的所能表示的數值範圍 在這裡我們只談論 java中的數值型別 首先說byte: 這段是摘自jdk中 Byte.java中的原始碼: view plaincopy to clipbo

Java中的byte/char/String資料型別轉換

前言:專案中遇到了一個問題,Android手機和硬體建立Socket通訊,當手機批量傳送資料時,傳送頻率高於微控制器接收報文進入中斷處理的頻率,導致硬體處理不過來。解決的方法是將原先的String型別的大量報文包含的資訊,簡化成一條十六進位制的報文。 在解決完

inputStream、File、ByteString等等之間的相互轉換

array odi finall ioutils post 字符串 stack sts col 一:inputStream轉換 1、inputStream轉為byte //方法一 org.apache.commons.io.IOUtils包下的實現(建議) IO

原始碼分析所得 charint之間的轉換

 公司用的是 hibernate 做資料庫查詢,其中 jar 包是這些。 在翻閱原始碼的時候有些問題不得解。在不懈努力下,以及前輩大神的指導下終於明白了。 String biz_stage = "007"; StringBuilder sql1 = new StringBuil

char string CString 之間的相互轉換

以上是多位元組版本。 =========================================================================================== 以下是寬位元組也就是UNICODE版本 ===============

【14】unsigned charcharint之間的轉換

一、把所佔位元組較大的資料賦值給所佔位元組較小的資料 unsigned short a = 256; char b = a; printf("%d",b); 輸出的b的值是0,因為256超過了char型別的最大值,即寬資料變窄資料:保留低地址資料 256  即000

vs2010 unicode 下型別轉換CString,char*,char,string,int,double

Unicode下 string 轉 CStringstring msg = ""; CString cs; cs.Format(_T("%s"),CStringW(msg.c_str())); //C

byte[]陣列和int 之間的轉換

&: 按位與,當兩位同時為1時才返回1。 1011 1010 & 1111 1111 = 1011 1010,還是得到是原值(類似位置對應)。 |:按位或,只要有一位為1即可返回1。1011 1010 0000 0000 | 1011 0101 = 1011

Javachar,short,int,long占幾個字節和多少位

als 後綴 運算 計量單位 bit 1byte decimal byte ima 1.字節:byte:用來計量存儲容量的一種計量單位;位:bit 2.一個字節等於8位 1byte = 8bit char占用的是2個字節 16位,所以一個char類型的可以存儲一個漢字。

javacharint的轉換問題

眾所周知,java中int型和char型資料不像c語言中那樣可以任意轉換,即不可以將一個int型變數自動轉換為char型,如下面程式碼中的演示:public class TestSort{ public static void main(String args[]){  in

Java 8 Lsit和Map之間轉化-程式碼示例

1、List<T>轉Map<S,List<T>> Map<String, List<Entity>> demoMap = demoList.stream() .col

關於Javacharint的互轉

昨天做大疆的筆試題,遇到了這個蛋疼的問題,居然花了很多時間在這個小知識點上。下面總結下。 先來看看直接轉換會得到什麼結果: char c = 'a'; int i = c; System.out.pri

byte[]陣列和int之間的轉換

這裡簡單記錄下兩種轉換方式: 第一種: 1、int與byte[]之間的轉換(類似的byte short,long型) /** * 將int數值轉換為佔四個位元組的byte陣列,本方法適用於(低位在前,高位在後)的順序。 和bytesToInt()配套使用

WCHAR PWCHAR CHAR String之間寬字元和標準字元之間互相轉換

在使用前宣告,之後用W2A,A2W進行轉換 #include <atlconv.h> USES_CONVERSION; WCHAR pszParentDeviceInstanceId[MA

javacharint型別的相互轉換

char型別轉int型: char numChar = '9'; int nSum = numChar-'0'; int型別轉cahr型:int num = 9; char numChar = n

java各型別Stringintchar,long,StringBuilder,StringBuffer,Integer之間的轉換總結

String和char型別之間的轉換: 1、 String→char:因為String是字串,而char是單個字元,只能把String   轉化為char陣列,方法為 char []ch=str.toCharArray(); 2、char→String: 方法如下:     方法一:St

javaStringint之間的相互轉化

java中 String和int之間的相互轉化 (1)int i = Integer([String]); 或     int i = Integer.parseInt([String],[int index]);(2)int i = Integer.valueOf([St