简体   繁体   中英

Convert java string with odd length to hex byte array

I need to convert string to hexademical byte array,my code is:

 public static byte[] stringToHex(final String buf)
    {
        return DatatypeConverter.parseHexBinary(buf);
    }

According to java doc to convert string to Hex DatatypeConverter use the following implementation

public byte[] parseHexBinary(String s) {
        final int len = s.length();

        // "111" is not a valid hex encoding.
        if (len % 2 != 0) {
            throw new IllegalArgumentException("hexBinary needs to be even-length: " + s);
        }

        byte[] out = new byte[len / 2];

        for (int i = 0; i < len; i += 2) {
            int h = hexToBin(s.charAt(i));
            int l = hexToBin(s.charAt(i + 1));
            if (h == -1 || l == -1) {
                throw new IllegalArgumentException("contains illegal character for hexBinary: " + s);
            }

            out[i / 2] = (byte) (h * 16 + l);
        }

        return out;
    }

It means that only strings with the even length is legal to be converted.But in php there is no such constraint For example code in php:

echo pack("H*", "250922f67dcbc2b97184464a91e7f8f");

And in java

String hex = "250922f67dcbc2b97184464a91e7f8f";
        System.out.println(stringToHex(hex));//my method that was described earlier

Why the following string is legal in php?

PHP just adds a final 0 in case the number of characters is odd.

Both of these

echo pack("H*", "48454C50");
echo pack("H*", "48454C5");

yield

HELP

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM