java--十六进制转byte数组和byte数组转十六进制

怎么说,最近使用ssm框架的时候,需要将文件转成十六进制的字符串传入数据库,按照传统的sql,一个rs.getBinaryStream()还有rs.setBinaryStream()就可以了,可是在ssm里面就不能这么写的啦。要用纯java去遍历了。

 

首先我们了解一下byte[]和十六进制字符串。

 

众所周知,byte就是我们所说的字节,一个字节有8位的长度,而一个中文字占两个字节,一个十六进制的数用四位可以表示,有了这个基本的认知就可以开始进行转换了!

 

16进制转byte数组

 

     String src = result.getBinaryFile();

        

      // 将十六进制转化为byte和String

      byte[] baKeyword = new byte[src.length()/2];

      for(int i = 0; i < baKeyword.length; i++) {

        try {

         // 当byte要转化为int的时候,高的24位必然会补1,这样,其二进制补码其实已经不一致了,&0xff可以将高的24位置为0,低8位保持原样。这样做的目的就是为了保证二进制数据的一致性。

         baKeyword[i] = (byte)(0xff & Integer.parseInt(src.substring(i*2, i*2+2),16));

        }

        catch(Exception e) {

         e.printStackTrace();

        }

        }

 

关键在于明白一个十六进制占4位,需要两个十六进制才能构成一个字节,然后用Integer16进制输出,接下来还要用0xff对这数进行与(&)运算,原因是在于,这8位构成的数转成32位的INTEGER类型时,需要在前24位自动补1,这样很明显会造成偏差,所以就需要一个全1的十六进制数来和它进行与运算,将前24位转成0,后面的得以保留。这样baKeyword 出来的就是完整的byte数组了,就算里面有中文也可以资瓷啊!当然,可能你还需要把这个数组转成流输出到网页中,用来下载查看啥的,这样的话,只需要把inputStream = ByteArrayInputStream(baKeyword),然后用前台传过来的response.getoutputStream循环写一次就OK

 

byte数组16进制

 

ByteArrayOutputStream baos = new ByteArrayOutputStream();

                     byte[] b = new byte[4096];

                     int i = is.read(b);

                     while(i != -1) {

                     baos.write(b,0,i);

                     i = is.read(b);

                     }

Byte[] a = baos.toByteArray()

 

反过来明显简单一点,不过也是跟ByteArrayOutputStream脱不了关系。注意:这里的数组我用inputstream.read()代替了,你也可用数组循环遍历,都是一样的,用ByteArrayOutputStream循环写完后,byte数组就都在baos.toByteArray()里面了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值