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);
這段代碼依然不能夠打印出我們期望的結果*/
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中定義變量并不需要賦予初始值,系統自動為其賦0值或null,但是這僅限于在類中定義的屬于類的類變量,
而對于在類函數中定義的臨時變量,則必須要賦初始值,否則會出錯的!
(2)位運算賦默認的兩端都是int型變量,而且返回值也是int型的。如果在位運算符的兩端有一個變量為long型,則返回值也為long型。
(3)對于byte類型,比較特殊,首先它是整型,而且只有一個字節長度,而且是有符號的,這里需要特別說明的是
java中不會區分無符號和有符號,既然byte是一個字節的有符號數,那它的表示范圍就是-128~127,但是我們經常會把byte作為
單字節的容器,比如在文件讀寫時,或作為緩沖區時都是使用byte這種類型,如果要把byte轉化為字符時就會有問題,
比如:例如下面一個例子:
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);
}
}
輸出字符串的結果和字符串s不一樣了.
這是因為對于byte[]類型,它也是Object的子類,但是數組這種特殊的子類并沒有特別的實現自己的toString()方法,因此我們調用
"b.toString()"后,實際上還是調用了Object父類里的toString方法<函數體內的具體代碼是:
getClass().getName() + "@" + Integer.toHexString(hashCode())>,該方法只是返回了該類的Name+@+hashCode而已!
有意思的是,對于數組類,類名字是在"["后緊跟數組的類型,比如這里返回的就是"[B",呵呵,挺有趣吧?
經過以下方式轉碼就可以正確轉換了:
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();
}
}
}
因此如果只是單純的使用它來作為一個中轉的用途,那就無所謂了,但是一旦涉及到和字符的轉化時就會有問題,
這里就暫且使用上述提到的方法,即重新構造一個String對象,但是構造String對象有著如下的從byte[]
轉化為String類型的潛規則:
如果byte里存儲的數據范圍是0~127時,也就是字節的首位為0時,就會將byte[]數組中的一個字節拿出來轉化為一個
兩個字節的char類型,并把這個字符放到String中,如果范圍為-128~-1時,也就是首位為1時,就會自動的把
btye[]中下一個字節也拿出來,讓這兩個字節組合成一個兩字節的char類型,然后存放到String中。從這里
也可以看出一個潛規則,漢字表示成兩字節的二進制時,第一個字節肯定是負值。
因此對于今天做的這個程序來說,想要把保存在byte[]中的IP地址數值直接拿出來,需要人為的把byte中存儲的
有符號數轉化為無符號數據,用簡單的位操作就可以實現了。
(4)還需要說明的一點是,java中沒有運算符重載,對于String類所謂的+號可以連接字符串,其實只是在編譯器里面做了點手腳,
并不是真正意義上的運算符重載。
(5)最后,還要說明的是,要熟練的掌握String和各種數值類型之間的轉化方法:
舉int型和String類型轉化的例子吧:
int b --> String str:
<1>str=""+b;
<2>str=Integer.toString(b);//從int出發,利用Integer包裝類實現
<3>str=String.valueOf(b);//從str出發,利用String類實現
String str --> int b;
b=Integer.parseInt(str);
b=Integer.parseInt(str, int radix);
最后,再對Integer.parseInt方法作一點說明,str字符串只能為三種形式之一,即"[0-9]*"、"-[0-9]*"
和"\u002D[0-9]*"兩種形式之一,其中負號'-'的ASCii碼就是\u002D,因此這兩種形式是等價的,除此之外
的形式均非法,這里為了寫得簡潔,使用了正則表達式的寫法[0-9]*表示任意長度數字序列。
*/