一个bit的消息码流样例
00000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000
00000000110001100000000000000000000000000000000000000000000001
00010111001101001011011010010111001101101011011110110111001110
10001100101011100100110111001100101011101000010111001100011011
01111011011010001000001100000000000000000000000000111000010010
01011100010111101100011011011110110111001110100011000010110001
101110100转换为字节数组的消息流
XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,03,18,00,00,
00,00,00,11,70,69,6D,2E,6D,6F,6E,74,65,72,6E,65,74,2E,63,6F,
6D,10,60,00,00,07,09,2E,2F,63,6F,6E,74,61,63,74---------------------------------------------------------------------这里假设测试一个较短是这样的字符串String binaryString = "101111001011110111101011";现在需要将该二进制字符串表示为一个16进制的字节数组,按这样的需求应该是每4位表示一个16进制1011 1100 1011 1101 1110 1011
 b    c    b    d    e    b最后我需要达到的结果应该是这样的一个字节数组byte[] bytes = {0xbc, 0xbd, 0xeb};
或者是
byte[] bytes = {bc, bd, eb};
需要这个编码字节数组

解决方案 »

  1.   

    public class Test {    public static void main(String[] args) {        
            String binaryString = "101111001011110111101011";
            byte[] bys = binaryString2Bytes(binaryString);
            System.out.println(bytes2HexSpace(bys));
        }
        
        public static byte[] binaryString2Bytes(String binaryString) {
            if(binaryString == null || binaryString.length() == 0) {
                return new byte[0];
            }
            if(!binaryString.matches("(?:[01]{4})+")) {
                throw new IllegalArgumentException("binary sequences is invalid");
            }
            char[] chs = binaryString.toCharArray();
            byte[] bys = new byte[chs.length / Byte.SIZE];
            for(int i = 0; i < bys.length; i++) {
                int num = 0;
                for(int j = 0; j < Byte.SIZE; j++) {
                    num = (num << 1) | (chs[i * Byte.SIZE + j] - '0');
                }
                bys[i] = (byte)num;
            }
            return bys;
        }
        
        /**
         * 将字节数组转成 16 进制的字符串来表示,每个字节采用两个字符表表示,每个字节间采用
         * 一个空格分隔
         * @param bys       需要转换成 16 进制的字节数组
         * @return
         */
        public static String bytes2HexSpace(byte[] bys) {
            char[] chs = new char[bys.length * 2 + bys.length - 1];
            for(int i = 0, offset = 0; i < bys.length; i++) {
                if(i > 0) {
                    chs[offset++] = ' ';
                }
                chs[offset++] = HEX[bys[i] >> 4 & 0xf];
                chs[offset++] = HEX[bys[i] & 0xf];
            }
            return new String(chs);
        }
        
        /**
         * 将字节数组转成 16 进制的字符串来表示,每个字节采用两个字符表表示
         * 
         * @param bys       需要转换成 16 进制的字节数组
         * @return
         */
        public static String bytes2Hex(byte[] bys) {
            char[] chs = new char[bys.length * 2];
            for(int i = 0, offset = 0; i < bys.length; i++) {
                chs[offset++] = HEX[bys[i] >> 4 & 0xf];
                chs[offset++] = HEX[bys[i] & 0xf];
            }
            return new String(chs);
        }
        
        private final static char[] HEX = "0123456789abcdef".toCharArray();
    }
      

  2.   

    把 !binaryString.matches("(?:[01]{4})+")  改成  !binaryString.matches("(?:[01]{8})+")
      

  3.   


    //在一看看 发现还是有机会强分 (高兴啊)
    //看下面的Long类的两个API 你会发现什么呢 哈哈 将二进制字符串分成64个字符(8个字节的long)一组
    //在用下面的函数不就行了
    类 Long
    java.lang.Object
      java.lang.Number
          java.lang.LongparseLong
    public static long parseLong(String s,
                                 int radix)
                          throws NumberFormatException将 string 参数解析为有符号的 long,基数
    由第二个参数指定。字符串中的字符必须为指定基数中的数字(由 Character.digit(char, int) 是否返回
    一个非负值来确定),除非第一个字符为 ASCII 字符的减号 '-' ('\u002D'),它表示一个负值。返回得到
    的 long 值。 
    注意,不允许将字符 L ('\u004C') 和 l ('\u006C') 作为类型指示符出现在字符串的结尾处,而这一点
    在 Java 编程语言源代码中是允许的——除非 L 或 l 以大于 22 的基数形式出现。 如果出现以下情形之一,则抛出 NumberFormatException 类型的异常: 第一个参数是 null 或零长度的字符串。 
    radix 小于 Character.MIN_RADIX 或者大于 Character.MAX_RADIX。 
    任何字符串的字符都不是指定基数的数字,除非第一个字符是减号 '-' ('\u002d'),假定字符串的长度大于
     1。 
    字符串表示的值不是 long 类型的值。 
    示例: parseLong("0", 10) returns 0L
    parseLong("473", 10) returns 473L
    parseLong("-0", 10) returns 0L
    parseLong("-FF", 16) returns -255L
    parseLong("1100110", 2) returns 102L
    parseLong("99", 8) returns NumberFormatException
    parseLong("Hazelnut", 10) returns NumberFormatException
    parseLong("Hazelnut", 36) returns 1356099454469L参数:
    s - 包含要解析的 long 表示形式的 String。
    radix - 将在解析 s 时使用的基数。 
    返回:
    由指定基数中的字符串参数表示的 long。 
    抛出: 
    NumberFormatException - 如果字符串不包含可解析的 long。toHexString
    public static String toHexString(long i)以十六进制无符号整数形式返回 long 参数的字符串表示形式。 
    如果参数为负,则无符号 long 值为该参数加上 264;否则,它等于该参数。此值将被转换为不带附加前导 0 的十六进制(基数 16)ASCII 数字字符串。如果无符号大小为零,则该数字由单个零字符 '0' 表示 ('\u0030');否则,无符号大小表示形式中的第一个字符将不是零字符。下列字符都被用作十六进制数字: 0123456789abcdef
     这些是从 '\u0030' 到 '\u0039' 和从 '\u0061' 到 '\u0066' 的字符。如果需要使用大写字母,则可以在结果上调用 String.toUpperCase() 方法: 
    Long.toHexString(n).toUpperCase()
     
    参数:
    i - 要转换为字符串的 long。 
    返回:
    十六进制(基数 16)参数表示的无符号 long 值的字符串表示形式。
    从以下版本开始: 
    JDK 1.0.2 
      

  4.   

    同上
    最后我需要达到的结果应该是这样的一个字节数组 byte[] bytes = {0xbc, 0xbd, 0xeb}; 
    或者是 
    byte[] bytes = {bc, bd, eb}; 
    需要这个编码字节数组byte里存放的是数值,与其赋值时用的是十进制还是十六进制无关
    要打印出的结果是"byte[] bytes = {0xbc, 0xbd, 0xeb};"
    则是byte别一种表示的形式,转换一下就可以了
      

  5.   

    byte[] bytes = {0xbc, 0xbd, 0xeb}; 
    或者是 
    byte[] bytes = {bc, bd, eb}; 请问这个byte数组中bc是什么意思是指 byte数的十六进制表示吗
    那LZ的意思是把二进制的字符消息流 转换为 byte为单位的数字形式 
    就用Byte类吧 8个字符转换一次
    转换的书存入数组 内存里面肯定是二进制的表示方式也就可以看成16进制的表示方式
    不过话说回来LZ的表叙有点混乱 特别是那个Byte数组为什么是{bc, bd, eb}
    若bc等是十六进制数的表示 那不多此一举吗 因为内存中被来就是这个样子
    parseByte
    public static byte parseByte(String s,
                                 int radix)
                          throws NumberFormatException将 string 参数解析为一个有符号的 byte,
    其基数由第二个参数指定。除了第一个字符可以是表示负值的 ASCII 负号 '-' ('\u002D') 之外(这取决
    于 Character.digit(char, int) 是否返回非负值),该 string 中的字符必须都是指定基数的数字。返回得到的 byte 值。 
    如果出现下列任何一种情况,则抛出一个 NumberFormatException 类型的异常: 第一个参数为 null 或是一个长度为零的字符串。 
    基数小于 Character.MIN_RADIX 或者大于 Character.MAX_RADIX。 
    字符串的任一字符不是指定基数的数字,第一个字符是负号 '-' ('\u002D') 的情况除外(但此时字符串的长
    度应超过 1)。 
    字符串所表示的值不是 byte 类型的值。 参数:
    s - 要解析的包含 byte 表示形式的 String
    radix - 在解析 s 时使用的基数 
    返回:
    以指定基数表示的 string 参数所表示的 byte 值 
    抛出: 
    NumberFormatException - 如果该 string 不包含一个可解析的 byte。
      

  6.   

    这样的码流是同步服务器下发终端的同步消息,终端接收到通知后以什么样的方式或者
    什么样的内容或者形式向同步服务器发起同步,当然终端必须符合syncML协议才能正确
    解析这样的码流,终端的类型可以有多种(手机、PDA或者电脑等),该码流是需要经过
    重复多次的BASE64和MD5加密的,所以有些麻烦。
      

  7.   

    将音频与 Java 应用程序集成
    创建 Java HTTP Servlet
    Java应用程序内嵌图像资源的方法探讨
    JAVA中的指针,引用及对象的clone
    运用加密技术保护Java源代码
    用Java开发代理服务器
    关于Java中文问题的几条分析原则
    使用JAVA中的动态代理实现数据库连接池
    Java 中的异步网络编程
    垃圾收集器与Java编程
    Java 实现 POS 打印机无驱打印
    JSP/Servlet 中的汉字编码问题
    用jsp进行数据分页显示的一个实现
    错误的堆大小产生的 "堆问题"
    Tomcat全攻略
    内存详解
    压缩 SOAP
    Merlin 的魔力: 异常和日志记录
    构建自己的监测工具
    Struts 与 Velocity 的集成
    链式违例机制
    使用 XStream 把 Java 对象序列化为 XML
    关注性能: 调优垃圾收集
    线程池的介绍及简单实现
    使用 Eclipse 远程调试 Java 应用程序
    使用 Eclipse 帮助系统为项目编制文档
    在运行时将数据与 XSLT 样式表集成
    技巧: 从 XSL 样式表输出 HTML
    提示和技巧:JDBC 提示
    一劳永逸的数据库编码解决方案
    使用 Eclipse 平台进行调试
      

  8.   

    连载 
    掌握 Ajax,第 1 部分Merlin 的魔力
    http://www.ibm.com/developerworks/cn/java/j-merlin/index.htmlOracle
    http://www.net130.com/Class/oracle_tech_jc/oracle_tech_jc01.html