将String转换为它表示的十六进制值

时间:2011-12-15 14:57:38

标签: java android string hex

这让我疯了,因为我知道这是一个简单的解决方案,但我找不到......

我有一个要求十六进制数字的edittext字段,文本字段仅限于接收0-9,a,b,c,d,e,f。

如何将此字符串转换为实际数字?

实施例: String = 0F => int = 0F或者可能=> 0000 1111.

我正在尝试存储MAC地址,然后操纵它们,我只知道如何将字符串存储到SQLite中! :)

3 个答案:

答案 0 :(得分:4)

Integer.parseInt(String s, int radix)就是你想要的。传入16作为基数。 Read the docs here

对于MAC地址,您可能会发现Integer类型不够大,因此请尝试使用Long等效字词。

如果即使Long不够大,或者你想要任意大的精度,那么请改用BigInteger。您可以将基数传递给构造函数:public BigInteger(String val, int radix)

为了获得更大的灵活性,请查看Apache Commons提供的IntegerValidator

答案 1 :(得分:0)

我不知道我遇到过多少次。所以我写了这个类,可以用Hex操作做很多事情。从字节数组转到十六进制,ascii ...只是高或低的笔尖...

/**
 * Utility class for hexadecimal conversions.
 *
 * @author john.matthews
 *
 */
public class Hex {
    /** Array of bytes with the Hex values representing ASCII characters '0' thru '9' and 'A' thru 'F' */
    private static byte HEX_BYTE_MAP[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46};

    /** Array of chars with the values '0' thru '9' and 'A' thru 'F' */
    private static char HEX_CHAR_MAP[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

    /**
     * Returns a string representation of the specified range of bytes in a byte array.
     * The hexadecimal value of each byte is converted to its ASCII representation and 
     * followed by a space.  <pre>For example: x'327F' ==> "32 7F "</pre>
     *
     * @param b - byte array containing the byte(s) to convert
     * @param offset - starting position in the array (0 being the leftmost position)
     * @param n - length or number of bytes to convert
     * @return string representing the bytes specified
     */
    public static String toHex(byte b[], int offset, int n) {
        int end = Math.min(offset+n, b.length);
        StringBuffer buffer = new StringBuffer();

        for(int i=offset; i<end; i++) {
            buffer.append(toHex(b[i]));
            buffer.append(" ");
        }

        return buffer.toString();
    }

    /**
     * Returns a string representation of all the bytes in a byte array.  The
     * hexadecimal value of each byte is converted to its ASCII representation and 
     * followed by a space.  <pre>For example: x'327F' ==> "32 7F "</pre>
     *
     * @param b - byte array to convert
     * @return string representing the bytes in the array
     */
    public static String toHex(byte b[]) {
        if(b==null)
            return "(null)";

        return toHex(b, 0, b.length);
    }

    /**
     * Returns a string representation of byte passed to this method. The
     * hexadecimal value of the byte is converted to its ASCII representation.
     * <pre>For example: x'7F' ==> "7F"</pre>
     * 
     * @param b - byte to convert
     * @return string representation of the byte
     */
    public static String toHex(byte b) {
          // Build an array of the characters corresponding to the left and right hex digits (nibbles)
          char[] array = { HEX_CHAR_MAP[(b >> 4) & 0x0f], HEX_CHAR_MAP[b & 0x0f] };

          return new String(array);
       }

    /**
     * Returns a string representation of character passed to this method. The
     * ASCII value of the character is converted to its hexadecimal representation
     * and is prefixed with two zeros.
     * <pre>For example: "N" ==> "004E"</pre>
     * 
     * @param c - character to convert
     * @return string representation of the character
     */
    public static String toHex(char c) {
              // The shifting right 8 bits for the hi byte results in 0!
              byte hi = (byte) (c >>> 8);
              // The lo byte contains the hex value for the character
              byte lo = (byte) (c & 0xff);

              return toHex(hi) + toHex(lo);
       }

    /**
     * Returns a string representation of the specified range of bytes in a byte array.
     * The hexadecimal value of each byte is used to look up its corresponding ASCII
     * character for display. Any nulls (value of x'00') are removed.
     * <pre>For example: x'31006A' ==> "1j"</pre>
     * 
     * @param b - byte array containing the byte(s) to convert
     * @param start - starting position in the array (0 being the leftmost position)
     * @param length - number of bytes to convert
     * @return string representing the bytes specified
     */
    public static String toASCII(byte b[], int start, int length) {
           StringBuffer asciiString = new StringBuffer();

           for (int i = start;i<(length+start);i++){
               // exclude nulls from the ASCII representation
               if (b[i] != (byte)0x00) {
                   asciiString.append((char)b[i]);
               }
           }

           return asciiString.toString();
       }


   /**
    * Returns a byte array with hexadecimal values of the specified ASCII representation
    * string.  Starting characters "0x" in the string are not converted.  Odd sized strings
    * will be padded with a zero for the leftmost nibble. 
    * <pre>For example: "0xF310D6A" ==> x'0F310D6A'</pre>
    * 
    * @param str - string to convert
    * @return byte array with hex values
    */
   public static byte[] toBytes(String str) {
       StringBuffer convString;

       // Remove hex prefix of "0x" if exists
       if (str.length() > 1 && str.toLowerCase().startsWith("0x")) {
           convString = new StringBuffer(str.substring(2));
       }
       else {
           convString = new StringBuffer(str);
       }

       // For odd sized strings, pad on the left with a 0
       if (convString.length() % 2 == 1) {
           convString.insert(0, '0');
       }

       byte[] result = new byte[convString.length() / 2];

       for (int i = 0; i < convString.length(); i += 2) {
           result[i/2] = (byte) (Integer.parseInt(convString.substring(i, i + 2), 16) & 0xFF);
       }

       return result;
   }

    /**
     * Converts an ASCII representation of a hexadecimal value into an actual hexadecimal byte.
     * <pre>For Example: hi="F" lo="8" ==> x'F8'</pre>
     * 
     * @param hi - high nibble or left hex digit in ASCII format
     * @param lo - low nibble or right hex digit in ASCII format
     * @return byte in hexadecimal format
     */
    public static byte fromASCII(byte hi, byte lo) {
        return (byte)Integer.parseInt(new String(new byte[]{hi,lo}), 16);
    }

    /**
     * Returns the decimal value of the specified range of ASCII represented 
     * hexadecimal nibbles.
     * <pre>For Example: x'007D' ==> "125"</pre>
     * 
     * @param asciiRepArray - array containing the bytes of ASCII to convert 
     * @param startPos - starting position in the array (0 being the leftmost position)
     * @param length - number of bytes to convert
     * @return string representation of the decimal value
     */
    public static String fromASCII(byte[] asciiArray, int startPos, int length) {
        int value = Integer.parseInt(Bytes.subsetAsString(asciiArray, startPos, length), 16);
        return "" + value;
    }

    /**
     * Returns the decimal value of the specified range of ASCII represented 
     * hexadecimal nibbles.  The returned string will be padded with leading
     * zeros for the specified number of digits.
     * <pre>For Example: x'007D', 4 digits ==> "0125"</pre>
     * 
     * @param asciiRepArray - array containing the bytes of ASCII to convert 
     * @param startPos - starting position in the array (0 being the leftmost position)
     * @param length - number of bytes to convert
     * @param digits - number of digits the result should have
     * @return string representation of the decimal value
     */
    public static String fromASCII(byte[] asciiArray, int startPos, int length, int digits) {
        String prePaddedValue = fromASCII(asciiArray, startPos, length);
        String padding = new String();

        for (int i = prePaddedValue.length(); i < digits; i++) {
            padding += "0";
        }

        return padding + prePaddedValue;
    }

    /**
     * Converts a hexadecimal value's high nibble into an ASCII representation byte.
     * <pre>For Example: x'F8' ==> "F"</pre>
     * 
     * @param hexByte - byte with the desired hex value
     * @return byte in ASCII format representing the left hex digit
     */
    public static byte nibHiToASCII(byte hexByte) {
        return HEX_BYTE_MAP[(hexByte & 0xF0)>>4];
    }

    /**
     * Converts a hexadecimal value's low nibble into an ASCII representation byte.
     * <pre>For Example: x'F8' ==> "8"</pre>
     *  
     * @param hexByte - byte with the desired hex value
     * @return byte in ASCII format representing the right hex digit
     */
    public static byte nibLoToASCII(byte hexByte) {
        return HEX_BYTE_MAP[hexByte & 0x0F];
    }
}

答案 2 :(得分:0)

对于偶数长度字符串

public static byte[] hexStringToByteArray(String str) {
try {


    String s = str;
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        if (i == len - 1) {
             System.out.println("in correct");                   
        } else {

            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                    + Character.digit(s.charAt(i + 1), 16));


        }
    }
    return data;
} catch (StringIndexOutOfBoundsException sex) {

    writeDirtyData(str.substring(0, str.indexOf(",")));
}
return null;

}

非奇数十六进制字符串是正确的。检查您的来源获取此字符串。这是因为字符串的限制没有字符串的截断。 如果String是图像存储在数据库中,则使用不使用任何工具的程序检索它

我遇到了与.net和MSSQL相同的问题,并使用webservice和Java Client我尝试了所有转换和库,包括axis和util jpg