学习笔记1:
FileStream.Read()的第二个参数offset真是费解,搞半天才知道设置为0,设置为其它值都报错。如何想指定流的当前位置,可以
filestream.Position = myOffset; 或
filestream.Seek(myOffset, SeekOrigin.Begin)
搞定。
学习笔记2:
整形输出为字符串.ToString(); 可带“X2”参数,指转化为大写十六进制字符串,不足2位前补0。
例子:
using System;
using System.IO;
using System.Text;
namespace FileReadWrite
{
class Program
{
///
///
///
/// 指定文件
/// 指定读取的偏移位置
/// 读取字节大小
/// 返回string字符串
public static string ReadData(string filename,
long offsetpost, int size)
{
FileStream
fs =new FileStream(filename,FileMode.Open);
byte[]
buffer =new byte[size];
fs.Position = offsetpost;
fs.Read(buffer, 0, size); //注意Read方法的第2个参数=0
StringBuilder sb=new StringBuilder();
string str
= "";
for (int i
= 0; i < size; i++)
{
sb.Append(buffer[i].ToString("X2"));
//"X2"参数指转化为十六进制,不足2位前补0;
sb.Append(" ");
}
return
sb.ToString();
}
static void Main(string[] args)
{
string str
= ReadData("APMS_Setup.exe",0xE0B6C, 19);
Console.WriteLine(str);
Console.ReadKey();
}
}
}
在Delphi下的代码也非常简洁,关键是能编译成原生代码:
function ReadFileData(filename: string; fileOffset: int64;
size: int64): string;
var
RBuffer:
TFileStream;
i: integer;
strHex: string;
buf: array of byte;
//读取缓存;
begin
SetLength(buf, size);
//设置动态数组长度。
RBuffer :=
TFileStream.Create(FileName, fmOpenRead);
try
RBuffer.Seek(0, soFromBeginning);
RBuffer.Position := FileOffset;
RBuffer.ReadBuffer(Pointer(Buf)^, size);
strHex := '';
for i := 0 to size - 1 do
begin
strHex :=
strHex + InttoHex(buf[i], 2) + ' '; // 等效C#里的
buffer[i].ToString("X2");
end;
finally
RBuffer.Free;
end;
result := strHex;
end;
【原创:东莞 黄仁来 2018-7-13】
加载中,请稍候......