内存映射数据处理类主要函数及变量如下:

         string _filepath;
/// <summary>
/// 引用内存映射文件
/// </summary>
private MemoryMappedFile _memoryFile = null;
/// <summary>
/// 用于访问内存映射文件的存取对象
/// </summary>
private MemoryMappedViewAccessor _accessor = null;
public ScientificData _ScientificData = new ScientificData();
long _lenByte = ;
public DatFileInfo(string filepath)
{
_filepath = filepath;
_memoryFile = MemoryMappedFile.CreateFromFile(_filepath);
_accessor = _memoryFile.CreateViewAccessor();
// _stream = _memoryFile.CreateViewStream();
FileInfo finfo = new FileInfo(filepath);
_lenByte = finfo.Length;//文件字节大小
}
public void SaveRawData(string savepath)
{ int currentByteNum = ;//当前字节位置
uint ACountint = ;
uint RCountint = ;
ScientificData scientificData = new ScientificData();
byte[] data = new byte[ * ];
while (currentByteNum<= (_lenByte- * ))
{
_accessor.Read<uint>(currentByteNum, out RCountint);
_accessor.Read<uint>(currentByteNum+, out ACountint);
if (RCountint < && ACountint < && _accessor.ReadByte(currentByteNum+)==0x0a && _accessor.ReadByte(currentByteNum + ) == 0x0b)//初步判断条件,节省解析结构体时间
{
_accessor.ReadArray(currentByteNum, data, , data.Length);//读取结构体数据到字节数组
scientificData = ByteToStructure<ScientificData>(data);//字节数组解析到结构体
if((scientificData.aux_3a1 == 0x3A) && (scientificData.aux_3a3 == 0x3A))//进一步判断
{
ushort[,] sdata = scientificData.GetImageData();//得到所需的数据
saveRawData(savepath + ((int)((ACountint - )/+)).ToString()+ "_" + (ACountint-).ToString() + "_"+ACountint + "_"+scientificData.aux_num + ".raw" , sdata);
currentByteNum += * ;
}
else
currentByteNum++;
}
else
currentByteNum++; }
}
/// <summary>
/// 由byte数组转换为结构体
/// </summary>
public static T ByteToStructure<T>(byte[] dataBuffer)
{
object structure = null;
int size = Marshal.SizeOf(typeof(T));
IntPtr allocIntPtr = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(dataBuffer, , allocIntPtr, size);
structure = Marshal.PtrToStructure(allocIntPtr, typeof(T));
}
finally
{
Marshal.FreeHGlobal(allocIntPtr);
}
return (T)structure;
}
private void saveRawData(string savepath,ushort[,] data)
{
int len = data.Length*;
byte[] bdata = new byte[len];
Buffer.BlockCopy(data,,bdata,,len);
File.WriteAllBytes(savepath, bdata);
}
/// <summary>
/// 由结构体转换为byte数组
/// </summary>
public static byte[] StructureToByte<T>(T structure)
{
int size = Marshal.SizeOf(typeof(T));
byte[] buffer = new byte[size];
IntPtr bufferIntPtr = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structure, bufferIntPtr, true);
Marshal.Copy(bufferIntPtr, buffer, , size);
}
finally
{
Marshal.FreeHGlobal(bufferIntPtr);
}
return buffer;
}

科学数据结构体定义如下:

  //一幅1036*1036字节数据定义
public struct ScientificData
{
/参数信息
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public byte[] RelativePacketCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public Byte[] AbsolutePacketCount;
........
public byte aux_3a;//填充3A H
.........
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public OneImageRow[] ImageData;//图像数据行
/// <summary>
/// 获取raw图数据
/// </summary>
/// <returns>图像数据</returns>
public ushort[,] GetImageData()
{
ushort[,] rawdata = new ushort[, ];
for (int i = ; i < ; i++)
{
var onerow = ImageData[i];
for (int j = ; j < ; j++)
{
rawdata[i, j] = (ushort)(((onerow.imagedata[j * ] << ) | onerow.imagedata[j * + ])) ;
}
}
return rawdata;
}
}

图像数据结构体如下:

    public struct OneImageRow
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public byte[] RelativePacketCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public byte[] AbsolutePacketCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public byte[] linehead;//行头
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public byte[] linenum;//行号
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public byte[] imagedata;//图像数据512×2=1024字节 public static string ByteToHex(byte[] bt)
{
var hex = BitConverter.ToString(bt, ).ToUpper();
return hex;
}
}

C#内存映射大文件并使用Marshal解析结构体信息的更多相关文章

  1. iOS将大文件映射到内存(读取大文件)

    http://blog.csdn.net/xyt243135803/article/details/40995759 在<中国区GPS偏移纠正(适用于Google地图)>一文中曾读取一个7 ...

  2. 字符设备驱动1:新的方式添加cdev + 在open函数中将文件私有数据指向设备结构体

    本例中,驱动入口处,使用cdev_add添加驱动,这点也可与字符设备驱动0:一个简单但完整的字符设备驱动程序对比一下. 另外主要讲xx_open实现文件私有数据指向设备结构体. 引子: 偶然看到,在j ...

  3. python如何将指定路径下的某类型文件,返回一个树形结构体,让前端显示为树形的目录结构

    最近遇到一个问题就是某个linux的目录下有各种文件现在的要求是只需要返回.kml格式的文件,并根据前端要求返回如下结构体即:[{'children': [{'children': [{'title' ...

  4. windows driver 映射大文件

    //如果要做到掉电后仍然可以继续向下操作,可以记录文件的位置重新映射 NTSTATUS status; UNICODE_STRING strFileSrc = RTL_CONSTANT_STRING( ...

  5. MMAP文件内存映射

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  6. Java NIO内存映射---上G大文件处理(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...

  7. 《Java核心技术卷二》笔记(二)文件操作和内存映射文件

    文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...

  8. Java NIO 内存映射文件

    Java NIO 内存映射文件 @author ixenos 文件操作的四大方法 前提:内存的访问速度比磁盘高几个数量级,但是基本的IO操作是直接调用native方法获得驱动和磁盘交互的,IO速度限制 ...

  9. JAVA I/O(三)内存映射文件

    <Java编程思想>中对内存映射文件有详细的介绍,此处仅做简单记录和总结.内存映射文件允许创建和修改因为太大而不能放入内存的文件. 1. 内存映射文件简单实例 import java.io ...

随机推荐

  1. Python函数-dir()

    dir([object])函数 作用: 没有参数,返回当前本地范围内的名称列表.使用参数,试图返回该对象的有效属性的列表. 说明: 默认dir()机制表现出有不同类型的对象,因为它试图产生最相关的,而 ...

  2. mysql之 percona-xtrabackup 2.4.7安装(热备工具)

    准备:os是centos6.7,提前下载并上传 percona-xtrabackup 安装包,下载网址为: https://www.percona.com/downloads/XtraBackup/L ...

  3. Mesos-slave启动处理记录

    1. work_dir错误导致启动异常 /etc/mesos-slave/work_dir设置的目录不存在或者权限不够将会导致启动异常. 2. 根据日志信息以及status信息来判断问题 通过serv ...

  4. BZOJ3141:[HNOI2013]旅行

    浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.p ...

  5. SqlServer 用户和权限操作

    use [master] GO --创建用户,Test,密码Test CREATE LOGIN [TestUser] WITH PASSWORD=N'Test', DEFAULT_DATABASE=[ ...

  6. WebForm中创建树节点TreeNode

    Tree: namespace ECTECH.NorthSJ.Web.SysData { public partial class testTree : BasePage { ; protected ...

  7. CSS-MUI:笔记-01

    ylbtech-CSS-MUI:笔记 1. mui-navbar   导航条返回顶部 1.1.样式一 1.2. <div class="mui-navbar-inner mui-bar ...

  8. 为什么每个浏览器都有Mozilla字样

    你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样?Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ( ...

  9. HTML5的local storage

    function clickLogin(){ var userName = $("#user").val().trim(); // console.log(userName); / ...

  10. 用Nmap检测漏洞

    介绍两个NSE脚本,可以检测CVE漏洞 nmap-vulners:https://github.com/vulnersCom/nmap-vulners vulscan:https://github.c ...