so true

心怀未来,开创未来!
随笔 - 160, 文章 - 0, 评论 - 40, 引用 - 0
数据加载中……

有关byte转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);
   这段代码依然不能够打印出我们期望的结果*/
   
   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]*表示任意长度数字序列。
*/

posted on 2007-12-28 22:58 so true 阅读(6840) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航: