/* * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.HexFormat; import java.util.stream.Collectors; /** * HexDumpReader provides utility methods to read a hex dump text file * and convert to an InputStream. The format supported by the methods * can be generated by the following command. * * $ od -vw -t x1 foo | sed -r -e 's/^[0-9]+ ?//' -e 's/ //g' -e '/^$/d' */ public final class HexDumpReader { // Utility class should not be instantiated private HexDumpReader() {} /* * Converts a Hex dump file given by the String name into an InputStream * containing bytes. The expected format of the file should be given as lines * that are either: * - Valid hexadecimal value(s) (two hexadecimal characters) combined with no * spaces between. E.g. "ace95365" represents four hexadecimal values. * There should not be an odd amount of hexadecimal characters. E.g. "ace" * - Contain leading comments given by '#' (which are ignored). E.g. "#foo" * Non-leading comments are not allowed. E.g. "ace953 #foo" * - Empty (which are ignored). */ public static InputStream getStreamFromHexDump(String fileName) throws IOException { return getStreamFromHexDump(new File(System.getProperty("test.src", "."), fileName)); } // Overloaded version of getStreamFromHexDump() that takes the File itself as input. public static InputStream getStreamFromHexDump(File hexFile) throws IOException { // This hexString should only consist of valid hexadecimal digits and be even // otherwise an exception will be thrown when converting to bytes String hexString = Files.readAllLines(hexFile.toPath(), StandardCharsets.UTF_8) .stream() .map(String::trim) .filter(s -> !s.isEmpty() && !s.startsWith("#")) .collect(Collectors.joining()); // Iterate the hex string and convert it to bytes byte[] bArray = HexFormat.of().parseHex(hexString); return new ByteArrayInputStream(bArray); } }