文档章节

byte[]转16进制字符串(Hex String)几种方法的速度比较(Java)

NealFeng
 NealFeng
发布于 2014/03/27 20:18
字数 333
阅读 333
收藏 0

速度由高到低:char[] (100ms),StringBuilder(250ms),StringBuilder + Integer.toHexString(1200ms),(100000次)

代码:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Test {

    public static void main(String[] args) {
        for(int j=0;j<2;j++) {
            toHexTest();
        }
    }

    private static void toHexTest() {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] r = md.digest(new String("haha").getBytes());
            long t0 = System.currentTimeMillis();
            int count = 1000000;
            for (int i = 0; i < count; i++) {
                r[0]++;
                String rs = bytes2Hex(r);
            }
            System.out.print("StringBuilder用时:");
            System.out.println(System.currentTimeMillis()-t0+"ms");
            
            t0 = System.currentTimeMillis();
            for (int i = 0; i < count; i++) {
                r[0]++;
                String rs2 = bytes2Hex2(r);
            }
            System.out.print("StringBuilder + Integer.toHexString用时:");
            System.out.println(System.currentTimeMillis()-t0+"ms");
            
            t0 = System.currentTimeMillis();
            for (int i = 0; i < count; i++) {
                r[0]++;
                String rs3 = bytes2Hex3(r);
            }
            System.out.print("char[]用时:");
            System.out.println(System.currentTimeMillis()-t0+"ms");
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }



    private static String bytes2Hex(byte[] in) {
        char[] c = new char[] {'0', '1', '2', '3', '4', '5', '6', 
                '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        StringBuilder sb = new StringBuilder(in.length*2);
        for (int i = 0; i < in.length; i++) {
            sb.append(c[in[i]&0x0f]);
            sb.append(c[(in[i]&0xf0)>>>4]);
        }
        return sb.toString();
    }
    
    private static String bytes2Hex2(byte[] r) {
        StringBuilder sb = new StringBuilder(r.length*2);
        for(int i = 0;i<r.length;i++) {
            sb.append(Integer.toHexString(r[i]&0x0f));
        }
        return sb.toString();
    }
    
    private static String bytes2Hex3(byte[] in) {
        char[] c = new char[] {'0', '1', '2', '3', '4', '5', '6', 
                '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        char[] sb = new char[in.length*2];
        for (int i = 0; i < in.length; i++) {
            sb[i++]=(c[in[i]&0x0f]);
            sb[i]=(c[(in[i]&0xf0)>>>4]);
        }
        return new String(sb);
    }
}

结果:

StringBuilder用时:261ms
StringBuilder + Integer.toHexString用时:1216ms
char[]用时:107ms
StringBuilder用时:242ms
StringBuilder + Integer.toHexString用时:1167ms
char[]用时:103ms


© 著作权归作者所有

NealFeng
粉丝 24
博文 55
码字总数 36482
作品 0
朝阳
程序员
私信 提问
java 中 16 进制 HEX 转换成字节码形式的 UTF-8

恩,又碰到个蛋疼的编码转换问题了:要把形如 xE9xBB 的字符串转成中文。。。 在python中我们直接 print "xE9xBBx84" 即可, 在shell中我们直接 echo $'xe9xbbx84' #echo -e 'xe9xbbx84'也行......

大数据之路
2013/02/01
7K
1
Java中byte与16进制字符串的互相转换

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和...

毛朱
2013/12/09
4.4K
0
Java中byte与16进制字符串的互相转换

ava中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低...

zhangyujsj
2013/11/26
15.3K
1
Java HexString-字节数组与十六进制字符数组转换

Java HexString-字节数组与十六进制字符数组转换 Java中byte(字节)用二进制表示占用8 bit (位),而我们知道16进制的每个字符需要用4位二进制位来表示,所以我们就可以把每个byte转换成两...

秋风醉了
2015/04/07
6.2K
0
IOS---NSdata 与 NSString,Byte数组,UIImage 的相互转换

NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc] initWithData:adataencoding:NSUTF8StringEncoding]; NSString->NSData NSString *aString = @"1234abcd"; ......

iKaisa
2013/05/06
408
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
今天
12
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
4
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.2K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部