/** Convert a Json map to a MD5MD5CRC32FileChecksum. */ public static MD5MD5CRC32FileChecksum toMD5MD5CRC32FileChecksum(final Map<?, ?> json) throws IOException { if (json == null) { return null; } final Map<?, ?> m = (Map<?, ?>) json.get(MD5MD5CRC32FileChecksum.class.getSimpleName()); final String algorithm = (String) m.get("algorithm"); final int length = (int) (long) (Long) m.get("length"); final byte[] bytes = StringUtils.hexStringToByte((String) m.get("bytes")); final DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); final int bytesPerCRC = in.readInt(); final long crcPerBlock = in.readLong(); final MD5Hash md5 = MD5Hash.read(in); final MD5MD5CRC32FileChecksum checksum = new MD5MD5CRC32FileChecksum(bytesPerCRC, crcPerBlock, md5); // check algorithm name final String alg = "MD5-of-" + crcPerBlock + "MD5-of-" + bytesPerCRC + "CRC32"; if (!alg.equals(algorithm)) { throw new IOException( "Algorithm not matched: algorithm=" + algorithm + ", crcPerBlock=" + crcPerBlock + ", bytesPerCRC=" + bytesPerCRC); } // check length if (length != checksum.getLength()) { throw new IOException( "Length not matched: length=" + length + ", checksum.getLength()=" + checksum.getLength()); } return checksum; }