黑马程序员技术交流社区

标题: 二进制问题 [打印本页]

作者: 胡帅冰    时间: 2013-5-24 18:30
标题: 二进制问题
本帖最后由 胡帅冰 于 2013-5-25 10:14 编辑

将一个字符串转换成字节数组之后,再通过Integer对象转换成二进制码,只有七位,而不是八位?怎么解决只有七位的问题,在开头添加0吗?
作者: Jacky_Chen1990    时间: 2013-5-24 18:45
帮顶。最好给个代码例子。。我不是很理解你的意思。。
作者: 王靖远    时间: 2013-5-24 19:58
不能直接加零吧,万一最高位是1呢。你只取到7位是不是遍历的时候出错了?
作者: 史政法    时间: 2013-5-24 20:15
与255不就行了
作者: 刘胜寒    时间: 2013-5-24 20:22
jvm自动省略前面的〇,可以用format试一试,format我不是很熟。自己看看API文档看看能不能解决,不然的话就自己在前面补上〇。
作者: 刘胜寒    时间: 2013-5-24 20:30
http://my.oschina.net/fvmitnick/blog/108077
你看一下
作者: First    时间: 2013-5-25 01:33
这是一个编码相关的问题,实际上字符串转换成二进制数 是什么数与选择的码表有关。

Charset
描述

US-ASCII 7 位 ASCII 字符,也叫作 ISO646-US、Unicode 字符集的基本拉丁块
ISO-8859-1   ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1
UTF-8 8 位 UCS 转换格式
UTF-16BE 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序
UTF-16LE 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序
UTF-16 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识


编码解码的例子



import java.util.*;

class  EncodeDemo
{
        public static void main(String[] args) throws Exception
        {
                String s = "你好";
                byte[] b1 = s.getBytes("utf-8");

                String s1 = new String (b1,"iso8859-1");

                byte[] b2 = s1.getBytes("iso8859-1");
                String s2 = new String (b2,"utf-8");

                System.out.println(s1);
                System.out.println(Arrays.toString(b1));
                System.out.println(s2);
        }
}

毕老师的视频是在第21天
作者: 胡帅冰    时间: 2013-5-25 10:19
这个问题解决了。一个字母字符是一个字节,这样的一个字节是七位二进制,这个是没错的。在编码的时候,需要在前面补0,然后在解码的时候,去掉前面的0就可以了。
我只是做了一个简单的“abcdef”字符串的实验,没有使用汉字字符串来证明。  
谢谢大家。
作者: 胡帅冰    时间: 2013-5-25 10:27
Jacky_Chen1990 发表于 2013-5-24 18:45
帮顶。最好给个代码例子。。我不是很理解你的意思。。

这个是我在做字符串转换成二进制,然后将二进制数存成int型数组的实验时遇到的问题。我的代码:
  1. import java.util.*;
  2. class  F
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 byte [] by="abcdefg".getBytes();
  7.                 int [] a=getInt(by);
  8.                 //打印int数组
  9.                 for(int c:a)
  10.                 {
  11.                         System.out.print(c+"..");
  12.                 }
  13.                 System.out.print(a.length);
  14.         }
  15.         public static  int [] getInt(byte [] by)
  16.         {
  17.                    StringBuilder  bs=new StringBuilder();
  18.                 String st;

  19.                 char [] ch=new char[by.length*7];
  20.                 int [] b=new int [by.length*8];
  21.                
  22.         //将字节转换成二进制的String表现形式之后添加到StringBuilder中
  23.                 for(int i=0;i<by.length;i++)
  24.                 {
  25.                         bs.append(Integer.toBinaryString(by[i]));
  26.                 }
  27.         
  28.                 st=bs.toString();
  29.                 ch=st.toCharArray();
  30.                 System.out.println(ch.length);
  31.                 //再将char类型的数组保持数据的原型转换成int型的数组。
  32.                 for(int i=0,j=0;i<by.length*8;i++)       
  33.                 {
  34.                         if(i==0||i==8||i==16||i==24||i==32||i==40)
  35.                                 b[i]=0;
  36.                         else
  37.                                 b[i]=Integer.parseInt(String.valueOf(ch[j++]));
  38.                 }
  39.                 return b;
  40.         }
  41.         /*public static String getString(int [] key)
  42.         {


  43.         }*/
  44. }
复制代码
其中的转换过程我写的有点过于麻烦了。
作者: 胡帅冰    时间: 2013-5-25 10:27
Jacky_Chen1990 发表于 2013-5-24 18:45
帮顶。最好给个代码例子。。我不是很理解你的意思。。

这个是我在做字符串转换成二进制,然后将二进制数存成int型数组的实验时遇到的问题。我的代码:
  1. import java.util.*;
  2. class  F
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 byte [] by="abcdefg".getBytes();
  7.                 int [] a=getInt(by);
  8.                 //打印int数组
  9.                 for(int c:a)
  10.                 {
  11.                         System.out.print(c+"..");
  12.                 }
  13.                 System.out.print(a.length);
  14.         }
  15.         public static  int [] getInt(byte [] by)
  16.         {
  17.                    StringBuilder  bs=new StringBuilder();
  18.                 String st;

  19.                 char [] ch=new char[by.length*7];
  20.                 int [] b=new int [by.length*8];
  21.                
  22.         //将字节转换成二进制的String表现形式之后添加到StringBuilder中
  23.                 for(int i=0;i<by.length;i++)
  24.                 {
  25.                         bs.append(Integer.toBinaryString(by[i]));
  26.                 }
  27.         
  28.                 st=bs.toString();
  29.                 ch=st.toCharArray();
  30.                 System.out.println(ch.length);
  31.                 //再将char类型的数组保持数据的原型转换成int型的数组。
  32.                 for(int i=0,j=0;i<by.length*8;i++)       
  33.                 {
  34.                         if(i==0||i==8||i==16||i==24||i==32||i==40)
  35.                                 b[i]=0;
  36.                         else
  37.                                 b[i]=Integer.parseInt(String.valueOf(ch[j++]));
  38.                 }
  39.                 return b;
  40.         }
  41.         /*public static String getString(int [] key)
  42.         {


  43.         }*/
  44. }
复制代码
其中的转换过程我写的有点过于麻烦了。
作者: 胡帅冰    时间: 2013-5-25 10:28
First 发表于 2013-5-25 01:33
这是一个编码相关的问题,实际上字符串转换成二进制数 是什么数与选择的码表有关。

Charset

谢谢。。
作者: First    时间: 2013-5-25 21:05
胡帅冰 发表于 2013-5-25 10:28
谢谢。。

相互学习




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2