如何将存储在字符串中的 png 十六进制值写入 Ruby 中的 png 文件?

How do I write png hex values stored in a string to a png file in Ruby?

我有一个 png 图像十六进制值存储在一个字符串中,但我想将其写入一个新的 png 文件以供查看。我目前使用下面的 Ruby 代码(带有一个小的 png 示例),但是当我检查新 png 文件中的输出时,十六进制值略有偏差。我哪里错了?

png_hex = "89504e470d0a1a0a0000000d494844520000000d0000000d08030000004535144e0000000774494d4507d7041517171c5943ea76000000097048597300000b1100000b11017f645f910000000467414d410000b18f0bfc610500000015504c544500000086c1e01544706ba4da4a85c6386c9f427ab6583bfce90000000174524e530040e6d866000000434944415478da558d41120030040395c8ff9f5cd421dd0b6b02b3e198c24f1d22c72996bed1683c89ae3d2f4856ed6570795b317dec0da45aba04ad2e761cfb7a4228bb5cb30147915c409a0000000049454e44ae426082"

File.open("temp.png", "w"){|fh|
 fh.print png_hex.scan(/.{2}/).map{|u| u.to_i(16)}.pack("C*")
}

使用"wb"代替"w"以二进制模式打开文件:

"b"  Binary file mode
     Suppresses EOL <-> CRLF conversion on Windows. And
     sets external encoding to ASCII-8BIT unless explicitly
     specified.

(source)

对了,你可以打电话 IO#putc无需创建数组和打包整数,直接将8位整数写入IO流:

File.open("temp.png", "wb"){|fh|
  png_hex.scan(/.{2}/) { |e| fh.putc(e.hex) }
}