//文件大小偏移
int
filesizeOffset = 0x0002;
//數據區偏移
int
dataOffset = 0x000A;
//圖像寬度偏移
int
widthOffset = 0x0012;
//圖像高度偏移
int
heightOffset = 0x0016;
//位數偏移
int
bitOffset = 0x001C;
//是否壓縮偏移
int
compressOffset = 0x001E;
//數據區大小偏移
int
datasizeOffset = 0x0022;
int
width = 0;
int
height = 0;
int
fileheadsize = 0;
int
dataseize = 0;
int
offset = 0;
//讀取待切分文件
string
file =
"c:\\1.bmp"
;
FileInfo fi =
new
FileInfo(file);
FileStream fs = fi.OpenRead();
byte
[] buff =
new
byte
[4];
//數據區偏移量
fs.Seek(dataOffset, SeekOrigin.Begin);
int
nBytesRead = fs.Read(buff, 0, buff.Length);
fileheadsize = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"數據區偏移:"
+fileheadsize);
//寬度
fs.Seek(widthOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
width = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"寬度:"
+ width);
//高度
fs.Seek(heightOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
height = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"高度:"
+ height);
//位數
fs.Seek(bitOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
offset = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"位數:"
+offset);
//是否壓縮
fs.Seek(compressOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
offset = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"壓縮:"
+ offset);
//數據區大小
fs.Seek(datasizeOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
dataseize = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"數據區大小:"
+ dataseize);
//讀取圖像下半部分,寫入11.bmp
FileStream fs1 =
new
FileStream(
"c:\\11.bmp"
,FileMode.OpenOrCreate);
//復制文件頭
fs.Seek(0,SeekOrigin.Begin);
byte
[] filehead =
new
byte
[fileheadsize];
fs.Read(filehead, 0, fileheadsize);
fs1.Write(filehead, 0, fileheadsize);
//復制數據
byte
[] data =
new
byte
[dataseize/2];
fs.Seek(fileheadsize, SeekOrigin.Begin);
fs.Read(data, 0, data.Length);
fs1.Write(data, 0, data.Length);
//修改高度,因為是水平切分,所以不需修改寬度
byte
[] b =
new
byte
[4];
b = BitConverter.GetBytes(height/2);
fs1.Seek(heightOffset, SeekOrigin.Begin);
fs1.Write(b, 0, buff.Length);
//修改數據區大小
b =
new
byte
[4];
b = BitConverter.GetBytes(dataseize/ 2);
fs1.Seek(datasizeOffset, SeekOrigin.Begin);
fs1.Write(b, 0, buff.Length);
//修改文件大小
b =
new
byte
[4];
b = BitConverter.GetBytes(fs1.Length);
fs1.Seek(filesizeOffset, SeekOrigin.Begin);
fs1.Write(b, 0, buff.Length);
//關閉對象
fs.Close();
fs1.Flush();
fs1.Close();
Console.Read();
讀取大文件
private
void
ReadStreamFromFile()
{
string
filePath =
@"D:\abc.txt"
;
int
bufferSize = 1024000;
//每次讀取的字節數
byte
[] buffer =
new
byte
[bufferSize];
System.IO.FileStream stream =
null
;
try
{
stream =
new
System.IO.FileStream(filePath, System.IO.FileMode.Open);
long
fileLength = stream.Length;
//文件流的長度
int
readCount = (
int
)Math.Ceiling((
double
)(bufferSize / fileLength));
//需要對文件讀取的次數
int
tempCount = 0;
//當前已經讀取的次數
do
{
stream.Read(buffer, tempCount * bufferSize, bufferSize);
//分readCount次讀取這個文件流,每次從上次讀取的結束位置開始讀取bufferSize個字節
//這里加入接收和處理數據的邏輯
tempCount++
//
}
while
(tempCount < readCount);
}
catch
{
}
finally
{
if
(stream !=
null
)
stream.Dispose();
}
}
using (var reader = new StreamReader(responseStream, encoding))
{
//10k
var clen = 1024 * 10;
var read = new Char[clen];
var count = reader.Read(read, 0, clen);
while (count > 0)
{
var str = new string(read, 0, count);
rsb.Append(str);
count = reader.Read(read, 0, clen);
}
reader.Close();
reader.Dispose();
responseStream.Dispose();
responseStream.Close();
response.Close();
}
{
//10k
var clen = 1024 * 10;
var read = new Char[clen];
var count = reader.Read(read, 0, clen);
while (count > 0)
{
var str = new string(read, 0, count);
rsb.Append(str);
count = reader.Read(read, 0, clen);
}
reader.Close();
reader.Dispose();
responseStream.Dispose();
responseStream.Close();
response.Close();
}