加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【C#学习】读取指定文件指定偏移位置指定大小的内容FileStream.Read()

(2018-07-13 23:29:54)
分类: C#学习
学习笔记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】


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有