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

         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. 检测硬件的批处理命令,检测硬件bat,一键获取电脑硬件信息

    警告:运行BAT源码是一种危险的动作,如果你不熟悉,请不要尝试! 批处理语言: 简体中文 授权方式: 免费软件 运行环境: Windows平台 检测硬件批处理命令.一键获取.直接双击就可以查看 @ec ...

  2. linux NTP配置

    时间是由计算机内的石英晶体振荡电路以:NetworkTimeProtocol(NTP):通常情况下,时间同步是按以下步骤进行的::(1):NTP客 户端向NTP服务器发出一个时间请:(2):当服务器接 ...

  3. 配置进程外Session

    配置进程外Session: (1)将服务器Session信息存储在进程外           <1> 首先,开启asp.net state 服务: 控制面板 -> 程序和功能 -&g ...

  4. POJ1063Cable master(二分搜索)

    Cable master Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36288   Accepted: 7743 Des ...

  5. [转载]linux内核中的HZ介绍

    时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据 HZ 值来设定,HZ 是一个体系依赖的值,在 <Linux/param.h>中定义或该文件包含的某个子平台相关文件中.作为通用 ...

  6. Runnable、Callable、Future和FutureTask之一:基本用法

    Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理.Thread类.Runnable接口和Java内存管理模型使得多线程编程简单直接.但正如之前提到过的,Thre ...

  7. AngularJS:事件

    ylbtech-AngularJS:事件 1.返回顶部 1. AngularJS 事件 AngularJS 有自己的 HTML 事件指令. ng-click 指令 ng-click 指令定义了 Ang ...

  8. Redis 集群之 Redis-Cluster

    Redis集群官方推荐方案 Redis-Cluster 集群 redis cluster 通过分片实࣫容量扩展 通过主从复制实࣫节点的高可用 节点之间互相通信 每个节点都维护整个集群的节点信息 red ...

  9. Pythonb编码规范

    本编码规范是对知道创宇研发技能表中提供的PythonCodingRule.pdf文档进行凝练和总结出来的结果,感谢知道创宇的Geek精神与分享精神 此规范较为严格,严格规定了编码格式和命名规则,仅适于 ...

  10. php学习之try catch

    PHP 5 添加了类似于其它语言的异常处理模块.在 PHP 代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获.(注:一定要先抛才能获取) 需要进行异常处理的代码都必须放入 try ...