【问题标题】:How to convert an image from URL to hex string?如何将图像从 URL 转换为十六进制字符串?
【发布时间】:2013-03-27 12:50:39
【问题描述】:

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

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

我想把它转换成如下的十六进制字符串格式:

89504E470D0A1A0A0000000D4948445200000124000001150802000000C6BD0FB3000000017352474200AECE1CE9000000097048597300000EC400000EC401952B0E1B000050B849444154785EED7D0B745CD759EE09E5618742A5C6F1833CB01A6E630587565E2154EE0D579203756DE823764B1ACAEB5A70EBAB2C08588EDB

但我不知道该怎么做。我该怎么做?

【问题讨论】:

  • 我认为这看起来更像是某种十六进制编码——每个字节都由一个两位数的十六进制值表示
  • @Andreas 是的,我没读好,我也这么认为
  • 你的意思是...... URL http://www.ex.com/image/pic.jpg 返回一个plain/text 内容,其中包含十六进制格式的给定字符串?这很奇怪。你到底是从哪里得到那个十六进制字符串的?你是自己打印的还是在某个地方看到的?是这样吗,究竟是怎样的,究竟在哪里?
  • 不,我想从任何给定的图像中获取类似于上述十六进制字符串的字符串。
  • 哦,你想把图片转换成十六进制字符串,而不是把十六进制字符串转换成图片。

标签: java image hex


【解决方案1】:

你可以做以下的组合:

  1. 获取图像的字节数组:Java- Convert bufferedimage to byte[] without writing to disk
  2. 获取字节数组的十六进制字符串:How to convert a byte array to a hex string in Java?

【讨论】:

    【解决方案2】:

    将图像读入字节数组:

    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);
    }
    

    【讨论】:

      【解决方案3】:

      只需使用通常的 Java I/O 方式以 byte[] 获取图像,然后将其依次提供给 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());
      // ...
      

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

      【讨论】:

        【解决方案4】:

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

        String s = javax.xml.bind.DatatypeConverter.printHexBinary(byteArray);
        

        【讨论】:

          猜你喜欢
          • 2015-01-15
          • 2013-02-07
          • 2017-08-23
          • 2014-03-19
          • 2011-08-25
          • 2014-04-28
          • 2018-01-31
          相关资源
          最近更新 更多