Java中有关byte和String的转换笔记和byte[]到short、int、long的相互转换

Java中有关byte和String的转换笔记

问题1:java中没有实现这种“byte a = 0xB2 --> String b = “B2””转换的简单实现需要自己实现。
答:自己编写的转换函数,思路将byte的高低4位分开,分别转换为对应的字符然后合成返回的字符串。
public static String byteToString(byte b) {
byte high, low;
byte maskHigh = (byte)0xf0;
byte maskLow = 0x0f;

high = (byte)((b & maskHigh) >> 4);
low = (byte)(b & maskLow);

StringBuffer buf = new StringBuffer();
buf.append(findHex(high));
buf.append(findHex(low));

return buf.toString();
}

private static char findHex(byte b) {
int t = new Byte(b).intValue();
t = t < 0 ? t + 16 : t;

if ((0 <= t) &&(t <= 9)) {
return (char)(t + '0');
}

return (char)(t-10+'A');
}

未解决的疑问在java中不存在类似C中的无符号量,所以如果一个字节超过0x80其对应的整型值即为负值,但在高位右移4位后还是负值,且与对应的正值相差16,比如0xB2经过右移后的期望值是0x0B(11)但实际值是-5与预期的值相差16(这个16通过多次试验得出),对此现象为找到合理的解释。

 

问题2:“String a=”B2” --> byte b=0xB2”字符的byte转换为byte数据类型
答:思路通过Integer作为转换的中间桥梁
public static int stringToByte(String in, byte[] b) throws Exception {
if (b.length < in.length() / 2) {
throw new Exception("byte array too small");
}

int j=0;
StringBuffer buf = new StringBuffer(2);
for (int i=0; i<in.length(); i++, j++) {
buf.insert(0, in.charAt(i));
buf.insert(1, in.charAt(i+1));
int t = Integer.parseInt(buf.toString(),16);
System.out.println("byte hex value:" + t);
b[j] = (byte)t;
i++;
buf.delete(0,2);
}

return j;
}

问题3:整数(表示范围限定为两个字节unsigned short)通过Integer.byteValue()转换成byte[2],如果超出一个byte的表示范围将会截断高位的值。
答:思路一个byte能表示的最大整数为256(超过128为负值,超过256将被截断),所以取256的倍数为byte[0],256的余数为byte[1]。
byte[] d = new byte[l+2];
….
buff.put(new Integer(l/256).byteValue());
buff.put(new Integer(l%256).byteValue());


<script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
public final static byte[] getBytes( short s, boolean asc) {
    byte[] buf = new byte[ 2];
    if (asc)      for ( int i = buf.length - 1; i >= 0; i--) {        buf[i] = ( byte) (s & 0x00ff);
        s >>= 8;
      }
    else
      for ( int i = 0; i < buf.length; i++) {
        buf[i] = ( byte) (s & 0x00ff);
        s >>= 8;
      }
    return buf;
  }
  public final static byte[] getBytes( int s, boolean asc) {
    byte[] buf = new byte[ 4];
    if (asc)
      for ( int i = buf.length - 1; i >= 0; i--) {
        buf[i] = ( byte) (s & 0x000000ff);
        s >>= 8;
      }
    else
      for ( int i = 0; i < buf.length; i++) {
        buf[i] = ( byte) (s & 0x000000ff);
        s >>= 8;
      }
    return buf;
  }
  public final static byte[] getBytes( long s, boolean asc) {
    byte[] buf = new byte[ 8];
    if (asc)
      for ( int i = buf.length - 1; i >= 0; i--) {
        buf[i] = ( byte) (s & 0x00000000000000ff);
        s >>= 8;
      }
    else
      for ( int i = 0; i < buf.length; i++) {
        buf[i] = ( byte) (s & 0x00000000000000ff);
        s >>= 8;
      }
    return buf;
  }
  public final static short getShort( byte[] buf, boolean asc) {
    if (buf == null) {
      throw new IllegalArgumentException( "byte array is null!");
    }
    if (buf.length > 2) {
      throw new IllegalArgumentException( "byte array size > 2 !");
    }
    short r = 0;
    if (asc)
      for ( int i = buf.length - 1; i >= 0; i--) {
        r <<= 8;
        r |= (buf[i] & 0x00ff);
      }
    else
      for ( int i = 0; i < buf.length; i++) {
        r <<= 8;
        r |= (buf[i] & 0x00ff);
      }
    return r;
  }
  public final static int getInt( byte[] buf, boolean asc) {
    if (buf == null) {
      throw new IllegalArgumentException( "byte array is null!");
    }
    if (buf.length > 4) {
      throw new IllegalArgumentException( "byte array size > 4 !");
    }
    int r = 0;
    if (asc)
      for ( int i = buf.length - 1; i >= 0; i--) {
        r <<= 8;
        r |= (buf[i] & 0x000000ff);
      }
    else
      for ( int i = 0; i < buf.length; i++) {
        r <<= 8;
        r |= (buf[i] & 0x000000ff);
      }
    return r;
  }
  public final static long getLong( byte[] buf, boolean asc) {
    if (buf == null) {
      throw new IllegalArgumentException( "byte array is null!");
    }
    if (buf.length > 8) {
      throw new IllegalArgumentException( "byte array size > 8 !");
    }
    long r = 0;
    if (asc)
      for ( int i = buf.length - 1; i >= 0; i--) {
        r <<= 8;
        r |= (buf[i] & 0x00000000000000ff);
      }
    else
      for ( int i = 0; i < buf.length; i++) {
        r <<= 8;
        r |= (buf[i] & 0x00000000000000ff);
      }
    return r;
  }

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值