1

Hi I am trying to convert hex String to byte array But I am getting Exception as Exception in thread "main" java.lang.NumberFormatException: For input string: " ".

Hex String:

  String sb = "0d 02 01 02 4e 52 30 39 47 30 35 36 31 38 00 03 00 fa 01 95 \n"
                    + "e4 53 c0 a8 51 b1 53 a3 03 40 89 54 66 9c ee 10 01 de 9a 5c \n"
                    + "22 e6 a0 2c 5d b2 69 8c 9d 79 e6 a5 41 50 c6 78 ab 31 8c 8a \n"
                    + "00 72 83 53 2a e0 67 14 d0 2a 54 1b 85 00 00 76 a6 b4 64 1e \n"
                    + "95 32 a1 c8 a5 90 f3 81 da 98 15 88 c7 51 54 6e 63 cb 1e 3a \n"
                    + "d6 99 19 19 ef 55 6e 13 2b 91 49 89 98 2f a7 49 b8 95 20 8a \n"
                    + "88 d9 cc b9 f9 0d 6d 85 e6 9e 23 e3 a5 06 7c a6 02 c6 e8 c3 \n"
                    + "2a 72 0d 74 90 1d d1 29 f5 14 cf 29 5b 82 01 fa 8a 9d 14 00 \n"
                    + "00 e0 50 38 ad 46 4c 38 15 89 7a b8 9c fa 11 5b f2 2e 56 a9 \n"
                    + "5c e9 ad 39 0e 18 03 8e f4 8a 68 c4 14 d2 39 ad 07 d2 ae 17 \n"
                    + "a0 0d f4 35 5d ed 27 4f bd 1b 0f c2 99 9d 88 06 41 ae 9f 4e \n"
                    + "19 b2 88 fb 57 36 54 83 c8 23 eb c5 74 da 70 c5 94 7f 4a 07 \n"
                    + "1d cb 2c 3e 53 58 77 1c ca 45 6e 37 dd 35 89 38 fd e9 a1 97 \n"
                    + "2d 88 76 d1 8a 76 29 c8 bb 98 52 32 23 da 4f 6a 96 38 01 19 \n"
                    + "6e 95 21 c0 e0 0a 98 0d d1 0c 75 14 0a c4 b6 d1 a0 8f 81 8c \n"
                    + "d3 9d 76 1a 92 24 21 00 a8 e7 38 fc 29 9b c7 62 85 c9 dc f8 \n"
                    + "f4 aa f8 a7 bb 65 89 a6 1e b4 8c a5 ab 0a 43 41 a6 f7 a0 43 \n"
                    + "5e 95 54 e0 50 06 48 06 a4 c7 14 0e 28 85 86 2a 32 78 a9 5e \n"
                    + "a0 90 e0 52 35 7b 12 e2 81 4b 8e 69 71 4c 60 bd 6a 74 a8 50 \n"
                    + "73 53 31 c0 da 3a d0 00 cd b8 e0 74 14 a0 8c e3 bd 20 18 1c \n"
                    + "75 a6 a9 cb 8d c3 9c d3 02 c4 7c 1a b8 83 8a aa 8a 59 b8 ab \n"
                    + "89 c0 02 80 1e 38 a5 52 41 e2 90 0a 51 40 0f f3 1b 34 ed e1 \n"
                    + "ba f5 a8 a9 71 40 12 16 e3 02 a2 75 ca 9a 78 a5 c1 34 01 45 \n"
                    + "46 3a d4 8b 43 ae d9 0f bd 0b 40 89 00 14 f0 05 31 4d 48 a2 \n"
                    + "81 8e db 9a 70 5a 45 19 a9 00 a6 16 1a 12 83 1e 6a 40 29 c1 \n"
                    + "68 15 91 58 db 46 df 79 14 fe 15 24 71 88 d7 6a 8c 01 da a6 \n"
                    + "c5 21 5a 01 22 0d 0a 2a 4b 57 00 0f 00 01 82 03 00 00 0d 0a ";
            String raw_DeviceId = sb.substring(37, 1040);

            byte[] b = HexStringToByteArray(raw_DeviceId);

Converting HexStringToByteArray

public static byte[] HexStringToByteArray(String hexStr) {
        byte bArray[] = new byte[hexStr.length()/2];  
         for(int i=0; i<(hexStr.length()/2); i++){
              byte firstNibble  = Byte.parseByte(hexStr.substring(2*i,2*i+1),16); // [x,y)
              byte secondNibble = Byte.parseByte(hexStr.substring(2*i+1,2*i+2),16);
              int finalByte = (secondNibble) | (firstNibble << 4 ); // bit-operations only with numbers, not bytes.
              bArray[i] = (byte) finalByte;
         }
         return bArray;
    }

Updated code:

 byte bArray[] = new byte[hexStr.length() / 2];
        for (int i = 0; i < (hexStr.length() / 2); i++) {
            if (hexStr.charAt(i) == ' ') {
                continue;
            } else {
                byte firstNibble = Byte.parseByte(hexStr.substring(2 * i, 2 * i + 1), 16); // [x,y)
                byte secondNibble = Byte.parseByte(hexStr.substring(2 * i + 1, 2 * i + 2), 16);
                int finalByte = (secondNibble) | (firstNibble << 4); // bit-operations only with numbers, not bytes.
                bArray[i] = (byte) finalByte;
            }
        }
        return bArray;

Updated:

 for (int i = 0; i < (hexStr.length() / 2); i++) {
            if (hexStr.charAt(i) == ' ') {
                continue;
            }
            byte firstNibble = Byte.parseByte(hexStr.substring(2 * i, 2 * i + 1), 16); // [x,y)
            byte secondNibble = Byte.parseByte(hexStr.substring(2 * i + 1, 2 * i + 2), 16);
            int finalByte = (secondNibble) | (firstNibble << 4); // bit-operations only with numbers, not bytes.
            bArray[i] = (byte) finalByte;
        }

Update:

1 38 00 03 00 fa 01 95 
e4 53 c0 a8 51 b1 53 a3 03 40 89 54 66 9c ee 10 01 de 9a 5c 
22 e6 a0 2c 5d b2 69 8c 9d 79 e6 a5 41 50 c6 78 ab 31 8c 8a 
00 72 83 53 2a e0 67 14 d0 2a 54 1b 85 00 00 76 a6 b4 64 1e 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
95 32 a1 c8 a5 90 f3 81 da 98 15 88 c7 51 54 6e 63 cb 1e 3a 
d6 99 19 19 ef 55 6e 13 2b 91 49 89 98 2f a7 49 b8 95 20 8a 
88 d9 cc b9 f9 0d 6d 85 e6 9e 23 e3 a5 06 7 at java.lang.String.substring(String.java:1907)
    at java.lang.String.substring(String.java:1907)
c a6 02 c6 e8 c3 
    at Image.HexStringToByteArray(Image.java:28)
    at Image.main(Image.java:73)
2a 72 0d 74 90 1d d1 29 f5 14 cf 29 5b 82 01 fa 8a 9d 14 00 
00 e0 50 38 ad 46 4c 38 15 89 7a b8 9c fa 11 5b f2 2e 56 a9 
5c e9 ad 39 0e 18 03 8e f4 8a 68 c4 14 d2 39 ad 07 d2 ae 17 
a0 0d f4 35 5d ed 27 4f bd 1b 0f c2 99 9d 88 06 41 ae 9f 4e 
19 b2 88 fb 57 36 54 83 c8 23 eb c5 74 da 70 c5 94 7f 4a 07 
1d cb 2c 3e 53 58 77 1c ca 45 6e 37 dd 35 89 38 fd e9 a1 97 
2d 88 76 d1 8a 76 29 c8 bb 98 52 32 23 da 4f 6a 96 38 01 19 
6e 95 21 c0 e0 0a 98 0d d1 0c 75 14 0a c4 b6 d1 a0 8f 81 8c 
d3 9d 76 1a 92 24 21 00 a8 e7 38 fc 29 9b c7 62 85 c9 dc f8 
f4 aa f8 a7 bb 65 89 a6 1e b4 8c a5 ab 0a 43 41 a6 f7 a0 43 
5e

Updated:

public static byte[] HexStringToByteArray(String hexStr) {
        System.out.println(hexStr);  // log our input make sure it is what we think it is.
        byte bArray[] = new byte[hexStr.length() / 3];
        int index = 0;
        for (String cell : hexStr.split(" ")) {
            byte firstNibble = Byte.parseByte(cell.substring(0, 1), 16); // [x,y)
            byte secondNibble = Byte.parseByte(cell.substring(1, 2), 16);
            byte finalByte = (byte) ((secondNibble) | (firstNibble << 4)); // bit-operations only with numbers, not bytes.
            bArray[index++] = finalByte;
        }
        return bArray;
    }

2 Answers 2

1

Your string hexStr contains spaces between successive bytes, you need to skip them. One way is putting

if(hexStr.charAt(i) == ' ') continue;

in the loop.

When you put a continue, you don't need to use else:

Byte bArray[] = new byte[hexStr.length()/2];  
for(int i=0; i<(hexStr.length()/2); i++){
    if(hexStr.charAt(i) == ' ') continue;
    byte firstNibble  = Byte.parseByte(hexStr.substring(2*i,2*i+1),16); // [x,y)
    byte secondNibble = Byte.parseByte(hexStr.substring(2*i+1,2*i+2),16);
    int finalByte = (secondNibble) | (firstNibble << 4 ); // bit-operations only with numbers, not bytes.
    bArray[i] = (byte) finalByte;
}
Sign up to request clarification or add additional context in comments.

2 Comments

I have updated my quetion still I am getting the same exception.
same exception i am getting I have updated the question.
1

Logging output always helps. There are a few problems here.

this chops a byte in half

String raw_DeviceId = sb.substring(37, 1040);

this line assumes each cell size is 2 charatcers , they arent most are 3 characters some are 4.

byte firstNibble  = Byte.parseByte(hexStr.substring(2*i,2*i+1),16); // [x,y)

try cleaning up the input a bit first

public static byte[] HexStringToByteArray(String hexStr) {
    System.out.println(hexStr);  // log our input make sure it is what we think it is.
    byte bArray[] = new byte[hexStr.length() /3 ];
    int index = 0;
    for (String cell : hexStr.split(" ")) {
        byte firstNibble  = Byte.parseByte(cell.substring(0,1),16); // [x,y)
        byte secondNibble = Byte.parseByte(cell.substring(1,2),16);
        byte finalByte = (byte)((secondNibble) | (firstNibble << 4 )); // bit-operations only with numbers, not bytes.
        bArray[index++] = finalByte;
    }
    return bArray;
}

7 Comments

for this I am getting java.lang.StringIndexOutOfBoundsException: String index out of range: 2.
You will still be chopping the first byte in half.
I am not understanding this exception: java.lang.StringIndexOutOfBoundsException: String index out of range: 2
it will come from secondNibble this code assumes that each cell with be exactly 2 characters followed by a space. If the input is misaligned then you will get a StringIndexOutOfBounds due to the substring calls on the cell.
try using String raw_DeviceId = sb.substring(36, 1040) in your calling method.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.