参考和部分表格摘自:http://www.cnblogs.com/kingmoon/archive/2011/04/18/2020097.html
在这方面我是新手,一些入门级别的学习,欢迎大牛给出教程或者学习资料。
万事开头难,先从c#读字节数组开始吧
最简单的文本文件字节读取:
static void Main(string[] args) { File.WriteAllText("D:/Test.txt", "aA"); var bytes = File.ReadAllBytes("D:/Test.txt"); Console.WriteLine(bytes); Console.Read(); }
字节这个概念并不是一堆01,也不需要取反码补码之类的。
这段代码打印出的值是97,65
正好对应ASCII码,但并不是这么简单,应该txt还有pe文件头的结构,估计字节码是在上一层的东西
加深理解,加一个UTF-8编码:
File.WriteAllText("D:/Test.txt", "aA", Encoding.UTF8);
打印:239,187,191,97,65
多了一个文件头的信息,指定是什么编码?是BOM?(猜的)。
再试试Unicode:
File.WriteAllText("D:/Test.txt", "aA", Encoding.Unicode);
打印:255,254,97,0,65,0
百度查了点资料,从bmp格式的解析学起
字 段 名 |
大小(单位:字节) |
描 述 |
bfType |
2 |
位图类别,根据不同的操作 系统而不同,在Windows 中,此字段的值总为‘BM’ |
bfSize |
4 |
BMP图像文件的大小 |
bfReserved1 |
2 |
总为0 |
bfReserved2 |
2 |
总为0 |
bfOffBits |
4 |
BMP图像数据的地址 |
前面2个字节的类型信息不太清楚,先看下4个字节的大小信息能否对应上,我创建了一个1x5像素的图片,图片大小是82字节
可以看见,后面4个字节里有82这个数,那么如果数据量更大,是如何进位的?byte格式的上限是255,先尝试一下大于255的大小
打印结果有点诡异,222和1
var bytes = File.ReadAllBytes("D:/a.bmp"); var value = BitConverter.ToInt32(new byte[] { 218, 3, 0, 0 }, 0); Console.WriteLine(value); Console.WriteLine(bytes); Console.Read();
然后研究了下,用BitConverter把值打出来,和windows里显示的容量值吻合了
打印结果:986
具体原理就是进位,好像还有高位在前低位在后的规则,没仔细研究
bmp位图文件头总共占用2+4+2+2+4=14个字节
然后再往下就是位图信息头
字 段 名 |
大小 (单位: 字节) |
描 述 |
biSize |
4 |
本结构的大小,根据不同的操作系统而不同,在Windows中,此字段的值总为28h字节=40字节 |
biWidth |
4 |
BMP图像的宽度,单位像素 |
biHeight |
4 |
总为0 |
biPlanes |
2 |
总为0 |
biBitCount |
2 |
BMP图像的色深,即一个像素用多少位表示,常见有1、4、8、16、24和32,分别对应单色、16色、256色、16位高彩色、24位真彩色和32位增强型真彩色 |
biCompression |
4 |
压缩方式,0表示不压缩,1表示RLE8压缩,2表示RLE4压缩,3表示每个像素值由指定的掩码决定 |
biSizeImage |
4 |
BMP图像数据大小,必须是4的倍数,图像数据大小不是4的倍数时用0填充补足 |
biXPelsPerMeter |
4 |
水平分辨率,单位像素/m |
biYPelsPerMeter |
4 |
垂直分辨率,单位像素/m |
biClrUsed |
4 |
BMP图像使用的颜色,0表示使用全部颜色,对于256色位图来说,此值为100h=256 |
biClrImportant |
4 |
重要的颜色数,此值为0时所有颜色都重要,对于使用调色板的BMP图像来说,当显卡不能够显示所有颜色时,此值将辅助驱动程序显示颜色 |
bisize不太好理解,比较一下biwidth试试
也就是说跳过前14+4个字节:
改了一次宽度,验证结果是否正确。不过有一点很奇怪,第18个字节应该是索引的17位,为什么多了一位。
暂时写这么多,晚上还有事。对字节的读取加深了理解
时间: 2024-10-28 21:05:36