so true

          心懷未來,開創(chuàng)未來!
          隨筆 - 160, 文章 - 0, 評(píng)論 - 40, 引用 - 0
          數(shù)據(jù)加載中……

          有關(guān)byte轉(zhuǎn)char、String的一些說明

          package com.bacoo.www;

          import java.applet.*;
          import java.net.*;

          public class InetAddDemo extends Applet{
           public void test(){
            try{
             InetAddress add=InetAddress.getLocalHost();
             System.out.println(add.getHostAddress());
             System.out.println(add.getHostName());
             System.out.println(InetAddress.getLocalHost());
             System.out.println(add.hashCode());
             byte [] b= add.getAddress();
             
             /*ByteArrayInputStream bais=new ByteArrayInputStream(b);
             InputStreamReader isr=new InputStreamReader(bais);
             BufferedReader br=new BufferedReader(isr);
             char [] ch=new char[b.length];
             br.read(ch);
             System.out.println(ch);
             這段代碼依然不能夠打印出我們期望的結(jié)果*/
             
             String s = "12345abcd";
             byte b2[] = s.getBytes();
             System.out.println(b2.toString());
             
             String s1="d我3a你2";
             byte [] s2=s1.getBytes();
             String s3=new String (s2);
             System.out.println(s3);
             String tt=new String(b);
             System.out.println(tt);
             System.out.println(Bytes2String(b));
             System.out.println(add.toString());
            }catch(Exception e){
             System.out.println(e.getMessage());
            }
           }
           
           public void init(){
            test();
           }
           
           public String Bytes2String(byte [] b){
            String str="";
            for(int i=0;i<b.length;i++){
             int t=(b[i]<<24)>>>24;
             str+=Integer.toString(t)+".";
            }
            str=str.substring(0, str.length()-1);
            return str;
           }
          }

          /*說明:
          (1)java中定義變量并不需要賦予初始值,系統(tǒng)自動(dòng)為其賦0值或null,但是這僅限于在類中定義的屬于類的類變量,
          而對(duì)于在類函數(shù)中定義的臨時(shí)變量,則必須要賦初始值,否則會(huì)出錯(cuò)的!
          (2)位運(yùn)算賦默認(rèn)的兩端都是int型變量,而且返回值也是int型的。如果在位運(yùn)算符的兩端有一個(gè)變量為long型,則返回值也為long型。
          (3)對(duì)于byte類型,比較特殊,首先它是整型,而且只有一個(gè)字節(jié)長度,而且是有符號(hào)的,這里需要特別說明的是
          java中不會(huì)區(qū)分無符號(hào)和有符號(hào),既然byte是一個(gè)字節(jié)的有符號(hào)數(shù),那它的表示范圍就是-128~127,但是我們經(jīng)常會(huì)把byte作為
          單字節(jié)的容器,比如在文件讀寫時(shí),或作為緩沖區(qū)時(shí)都是使用byte這種類型,如果要把byte轉(zhuǎn)化為字符時(shí)就會(huì)有問題,
          比如:例如下面一個(gè)例子:

           import java.io.UnsupportedEncodingException;

           public class test{
            public static void main(String g[]) {
             String s = "12345abcd";
             byte b[] = s.getBytes();
             String t = b.toString();

             System.out.println(t);

            }
           }
           輸出字符串的結(jié)果和字符串s不一樣了.
           這是因?yàn)閷?duì)于byte[]類型,它也是Object的子類,但是數(shù)組這種特殊的子類并沒有特別的實(shí)現(xiàn)自己的toString()方法,因此我們調(diào)用
           "b.toString()"后,實(shí)際上還是調(diào)用了Object父類里的toString方法<函數(shù)體內(nèi)的具體代碼是:
           getClass().getName() + "@" + Integer.toHexString(hashCode())>,該方法只是返回了該類的Name+@+hashCode而已!
           有意思的是,對(duì)于數(shù)組類,類名字是在"["后緊跟數(shù)組的類型,比如這里返回的就是"[B",呵呵,挺有趣吧?

           經(jīng)過以下方式轉(zhuǎn)碼就可以正確轉(zhuǎn)換了:

           public class test{
            public static void main(String g[]) {
             String s = "12345abcd";
             byte b[] = s.getBytes();
             try {
              String t = new String(b);
              System.out.print(t);
             } catch (Exception e) {
              e.printStackTrace();
             }
            }
           }
          因此如果只是單純的使用它來作為一個(gè)中轉(zhuǎn)的用途,那就無所謂了,但是一旦涉及到和字符的轉(zhuǎn)化時(shí)就會(huì)有問題,
          這里就暫且使用上述提到的方法,即重新構(gòu)造一個(gè)String對(duì)象,但是構(gòu)造String對(duì)象有著如下的從byte[]
          轉(zhuǎn)化為String類型的潛規(guī)則:
          如果byte里存儲(chǔ)的數(shù)據(jù)范圍是0~127時(shí),也就是字節(jié)的首位為0時(shí),就會(huì)將byte[]數(shù)組中的一個(gè)字節(jié)拿出來轉(zhuǎn)化為一個(gè)
          兩個(gè)字節(jié)的char類型,并把這個(gè)字符放到String中,如果范圍為-128~-1時(shí),也就是首位為1時(shí),就會(huì)自動(dòng)的把
          btye[]中下一個(gè)字節(jié)也拿出來,讓這兩個(gè)字節(jié)組合成一個(gè)兩字節(jié)的char類型,然后存放到String中。從這里
          也可以看出一個(gè)潛規(guī)則,漢字表示成兩字節(jié)的二進(jìn)制時(shí),第一個(gè)字節(jié)肯定是負(fù)值。
          因此對(duì)于今天做的這個(gè)程序來說,想要把保存在byte[]中的IP地址數(shù)值直接拿出來,需要人為的把byte中存儲(chǔ)的
          有符號(hào)數(shù)轉(zhuǎn)化為無符號(hào)數(shù)據(jù),用簡單的位操作就可以實(shí)現(xiàn)了。
          (4)還需要說明的一點(diǎn)是,java中沒有運(yùn)算符重載,對(duì)于String類所謂的+號(hào)可以連接字符串,其實(shí)只是在編譯器里面做了點(diǎn)手腳,
          并不是真正意義上的運(yùn)算符重載。
          (5)最后,還要說明的是,要熟練的掌握String和各種數(shù)值類型之間的轉(zhuǎn)化方法:
          舉int型和String類型轉(zhuǎn)化的例子吧:
          int b --> String str:
          <1>str=""+b;
          <2>str=Integer.toString(b);//從int出發(fā),利用Integer包裝類實(shí)現(xiàn)
          <3>str=String.valueOf(b);//從str出發(fā),利用String類實(shí)現(xiàn)
          String str --> int b;
          b=Integer.parseInt(str);
          b=Integer.parseInt(str, int radix);
          最后,再對(duì)Integer.parseInt方法作一點(diǎn)說明,str字符串只能為三種形式之一,即"[0-9]*"、"-[0-9]*"
          和"\u002D[0-9]*"兩種形式之一,其中負(fù)號(hào)'-'的ASCii碼就是\u002D,因此這兩種形式是等價(jià)的,除此之外
          的形式均非法,這里為了寫得簡潔,使用了正則表達(dá)式的寫法[0-9]*表示任意長度數(shù)字序列。
          */

          posted on 2007-12-28 22:58 so true 閱讀(6858) 評(píng)論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 华池县| 黄梅县| 高清| 龙江县| 恭城| 石狮市| 庆阳市| 松桃| 洮南市| 长岛县| 岑溪市| 永寿县| 汝城县| 渝北区| 平乐县| 南充市| 大足县| 光泽县| 塘沽区| 隆昌县| 全南县| 和平区| 五华县| 阳泉市| 平昌县| 交城县| 泸水县| 孙吴县| 射洪县| 平定县| 封丘县| 礼泉县| 九台市| 成武县| 沅江市| 翁源县| 高唐县| 綦江县| 娄底市| 西平县| 嵊泗县|