@Nullable @ReturnsMutableCopy public static byte[] getDecodedASCIIHex(@Nullable final byte[] aEncodedBuffer) { if (aEncodedBuffer == null) return null; final NonBlockingByteArrayOutputStream aBAOS = new NonBlockingByteArrayOutputStream(); try { boolean bFirstByte = true; int nFirstByte = 0; for (final byte nEncByte : aEncodedBuffer) { if (nEncByte == '>') break; // Ignore whitespaces if (Character.isWhitespace(nEncByte)) continue; final byte nDecByte = (byte) StringHelper.getHexValue((char) nEncByte); if (nDecByte == CGlobal.ILLEGAL_UINT) throw new DecodeException( "Failed to convert byte '" + nEncByte + "/" + ((char) nEncByte) + "' to hex value in ASCIIHexDecode"); if (bFirstByte) nFirstByte = nDecByte; else aBAOS.write((byte) (nFirstByte << 4 | nDecByte)); bFirstByte = !bFirstByte; } // Write trailing byte if (!bFirstByte) aBAOS.write((byte) (nFirstByte << 4)); return aBAOS.toByteArray(); } finally { StreamHelper.close(aBAOS); } }