【发布时间】:2015-07-13 07:01:10
【问题描述】:
我正在从磁盘打开一个 .bmp 文件,然后将其转换为字节数组。从那里,我想把它作为一个十六进制字符串,以便能够在文本框中显示十六进制数据。 问题是,字节数组和字符串中的输出与我在 notepad++ 或其他十六进制编辑器中打开 .bmp 时获得的十六进制数据不进行比较。
我的代码是
// getting image from a Picturebox
Bitmap inputBmp = (Bitmap)pictureBoxInput.Image;
// saving bmp to stream
MemoryStream imgStream = new MemoryStream();
inputBmp.Save(imgStream, inputBmp.RawFormat);
// convert to byte Array and SoapHexBinary
byte[] imgBytes = imgStream.ToArray();
SoapHexBinary imgHexBinary = new SoapHexBinary(imgBytes);
// create String out of HexBinary
string imgHexString = "";
imgHexString = imgHexBinary.ToString();
生成的字符串是(格式化的):
424D
36190000
0000
0000
36000000
28000000
28000000
28000000
0100
2000
00000000
00000000
10170000
10170000
00000000
00000000
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00FFE7CB00FFE7CB00FFE7CB00FFE7CB00FFE7CB00FFE7CB00FFE7CB00FFE7CB00...
但是根据 notepad++ 的预期输出,包括。十六进制编辑器将是:
42 4D
E0 01 00 00
00 00
00 00
7A 00 00 00
28 00 00 00
28 00 00 00
28 00 00 00
01 00
08 00
01 00 00 00
66 01 00 00
10 17 00 00
10 17 00 00
11 00 00 00
11 00 00 00
05 00 02 00
05 09 07 00
18 11 10 00
1F 21 20 00
39 32 31 00
46 3E 3D 00
6E 67 5F 00
7E 77 6F 00
91 8D 83 00
96 95 89 00
BA B2 A7 00
D3 C4 BA 00
F2 DE CE 00
ED E3 C6 00
FF E7 CB 00
FE EC CF 00
FF FF FF 00
28 0E 00 00 28 0E 00 00 28 0E 00 00 28 0E 00 00 28 0E 00 00
28 0E 00 00 28 0E 00 00 28 0E 00 00 28 0E 00 00 17 0E 01 09
01 02 0F 0E 00 00 16 0E 00 03 05 02 02 00 0F 0E 00 00 15 0E
00 04 02 00 00 02 0F 0E 00 00 13 0E 00 06 09 00 00 00 02 02 ...
那么有人可以解释为什么解码不同吗?不仅是解码:在手动解码的位图十六进制字符串中,只有一种颜色不断重复,四个字节 FFE7CB00 这根本没有意义。我错过了什么?
感谢您的帮助和建议。
【问题讨论】:
-
不,不是。我也尝试使用转换器解决方案:
byte[] imgBytes = (byte[])converter.ConvertTo(inputBmp, typeof(byte[]));但这导致了相同的结果。 -
你为什么要从图片框中截取图像?只需使用原始文件。哦,使用
SoapHexBinary除了 SOAP 十六进制二进制文件之外的任何东西听起来都是个坏主意 :)