3

我正在从 URL 下载图像,如下所示:

BufferedImage image = null;
URL url = new URL("http://www.ex.com/image/pic.jpg");
image = ImageIO.read(url);

我想将其转换为以下十六进制字符串格式:

89504E470D0A1A0A0000000D4948445200000124000001150802000000C6BD0FB3000000017352474200AECE1CE9000000097048597300000EC400000EC401952B0E1B000050B849444154785EED7D0B745CD759EE09E5618742A5C6F1833CB01A6E630587565E2154EE0D579203756DE823764B1ACAEB5A70EBAB2C08588EDB

但我不知道该怎么做。我怎样才能做到这一点?

4

4 回答 4

3

要将图像读入字节数组:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( image, "jpg", baos );
baos.flush();
byte[] imageInByte = baos.toByteArray();
baos.close();

并将其显示为字符串:

public static String bytesToHex(byte[] bytes) {
    final char[] hexArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    char[] hexChars = new char[bytes.length * 2];
    int v;
    for ( int j = 0; j < bytes.length; j++ ) {
        v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}
于 2013-03-27T12:59:09.260 回答
3

您可以执行以下组合:

  1. 获取图像的字节数组:Java-将缓冲图像转换为字节[]而不写入磁盘
  2. 获取字节数组的十六进制字符串:如何在 Java 中将字节数组转换为十六进制字符串?
于 2013-03-27T12:58:13.583 回答
2

只需byte[]以通常的 Java I/O 方式获取图像,然后依次输入DataTypeConverter#printHexBinary()以从中获取十六进制字符串。

ByteArrayOutputStream output = new ByteArrayOutputStream();

try (InputStream input = new URL("http://example.com/some.jpg").openStream()) {
    byte[] buffer = new byte[10240];
    for (int length = 0; (length = input.read(buffer)) > 0;) {
         output.write(buffer, 0, length);
    }
}

String hex = DatatypeConverter.printHexBinary(output.toByteArray());
// ...

请注意,您不需要ImageIO为此使用整个 Java 2D API ( et.al.)。这仅在您真正打算操纵图像(调整大小、裁剪、倾斜等)时才有用。

于 2013-03-27T13:10:36.217 回答
0

除了其他答案之外,一旦您阅读了图像,您还可以使用现有的javax.xml.bind.DatatypeConverter类将字节数组转换为十六进制字符串。理想情况下使用@BalusC的方法来节省内存并直接将图像读入字节数组,然后简单地做

String s = javax.xml.bind.DatatypeConverter.printHexBinary(byteArray);
于 2013-03-27T13:08:37.760 回答