RT
其实我要写的是Java的DES解密,只是手动指定密钥
密钥设计的是一个长度为16的String,里面都是十六进制。但Java给的API似乎要长度为8的Byte数组,所以想转过去。。
求解~

解决方案 »

  1.   

    能给个示例吗?
    比如:
    String s="0123456789abcdef";
    变成数组是什么样的?组成8个,还是16个?
      

  2.   

    package houlei.support.util;public abstract class HexUtil { public static char [] HEXs = new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

    public static String toString(byte b){
    return new StringBuilder(2).append(HEXs[(b&0xF0)>>4]).append(HEXs[b&0x0F]).toString();
    }

    public static String toString(byte [] data){
    StringBuilder buff = new StringBuilder(data.length<<1);
    for(int i=0;i<data.length;i++){
    buff.append(HEXs[(data[i]&0xF0)>>4]);
    buff.append(HEXs[data[i]&0x0F]);
    }
    return buff.toString();
    }

    public static String toString(byte [] data,int offset,int length){
    StringBuilder buff = new StringBuilder(data.length<<1);
    for(int i=0;i<length;i++){
    buff.append(HEXs[(data[i+offset]&0xF0)>>4]);
    buff.append(HEXs[data[i+offset]&0x0F]);
    }
    return buff.toString();
    }

    public static byte [] toBytes(String hex){
    int len = hex.length();
    if(len==0)return new byte[0];
    if(len%2!=0)throw new IllegalArgumentException("十六进制数据长度不是偶数个");
    byte b [] = new byte[(len>>1)];
    for(int i=0;i<b.length;i++){
    char ch = hex.charAt(2*i);
    if(ch>='0' && ch<='9'){
    b[i]=(byte)((ch-'0')<<4);
    }else if(ch>='a' && ch<='f'){
    b[i]=(byte)((ch-'a'+10)<<4);
    }else if(ch>='A' && ch<='F'){
    b[i]=(byte)((ch-'A'+10)<<4);
    }else{
    throw new IllegalArgumentException("参数不是十六进制数:"+ch);
    }
    ch = hex.charAt(2*i+1);
    if(ch>='0' && ch<='9'){
    b[i] |= (byte)(ch-'0');
    }else if(ch>='a' && ch<='f'){
    b[i] |= (byte)(ch-'a'+10);
    }else if(ch>='A' && ch<='F'){
    b[i] |= (byte)(ch-'A'+10);
    }else{
    throw new IllegalArgumentException("参数不是十六进制数:"+ch);
    }
    }
    return b;
    }

    public static byte [] toBytes(int number){
    byte[] data = new byte[4];
    data[0]=(byte)((number>>>24)&0xFF);
    data[1]=(byte)((number>>>16)&0xFF);
    data[2]=(byte)((number>>>8)&0xFF);
    data[3]=(byte)(number&0xFF);
    return data;
    }

    public static byte [] toBytes(long number){
    byte[] data = new byte[8];
    data[0]=(byte)((number>>>56)&0xFF);
    data[1]=(byte)((number>>>48)&0xFF);
    data[2]=(byte)((number>>>40)&0xFF);
    data[3]=(byte)((number>>>32)&0xFF);
    data[4]=(byte)((number>>>24)&0xFF);
    data[5]=(byte)((number>>>16)&0xFF);
    data[6]=(byte)((number>>>8)&0xFF);
    data[7]=(byte)(number&0xFF);
    return data;
    }

    public static byte [] toBytes(int number, boolean littleEndian){
    byte[] data = new byte[4];
    if(littleEndian){
    for(int i=0;i<data.length;i++){
    data[i]=(byte)((number>>>(i*8))&0xFF);
    }
    }else{
    for(int i=0;i<data.length;i++){
    data[i]=(byte)((number>>>((3-i)*8))&0xFF);
    }
    }
    return data;
    }

    public static byte [] toBytes(long number, boolean littleEndian){
    byte[] data = new byte[8];
    if(littleEndian){
    for(int i=0;i<data.length;i++){
    data[i]=(byte)((number>>>(i*8))&0xFF);
    }
    }else{
    for(int i=0;i<data.length;i++){
    data[i]=(byte)((number>>>((7-i)*8))&0xFF);
    }
    }
    return data;
    }

    public static int toInt(byte[] number){
    if(number.length!=4)throw new IllegalArgumentException("数据长度不够4字节");
    return (number[0]&0xFF)<<24 | (number[1]&0xFF)<<16 | 
    (number[2]&0xFF)<<8 | number[3]&0xFF;
    }

    public static int toInt(byte[] number, boolean littleEndian){
    if(number.length!=4)throw new IllegalArgumentException("数据长度不够4字节");
    int value = 0;
    if(littleEndian){
    for(int i=0;i<number.length;i++){
    value |= (number[i]&0xFF)<<(i*8);
    }
    }else{
    for(int i=0;i<number.length;i++){
    value |= (number[i]&0xFF)<<((3-i)*8);
    }
    }
    return value;
    }

    public static long toLong(byte[] number, boolean littleEndian){
    if(number.length!=8)throw new IllegalArgumentException("数据长度不够8字节");
    long value = 0;
    if(littleEndian){
    for(int i=0;i<number.length;i++){
    value |= ((long)(number[i]&0xFF))<<(i*8);
    }
    }else{
    for(int i=0;i<number.length;i++){
    value |= ((long)(number[i]&0xFF))<<((7-i)*8);
    }
    }
    return value;
    }

    }