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

         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. 自编jQuery插件实现模拟alert和confirm

    现在绝大多数网站都不用自带的alert和confirm了,因为界面太生硬了.因此这个插件就这样产生了自己定制一个的想法...... 啥也不说,先上图,有图有真相 :) 现在绝大多数网站都不用自带的al ...

  2. SQL Sever 学习系列之二

    SQL Sever 学习系列之二 SQL Server 学习系列之一(薪酬方案+基础) 四.有关时间输出问题      select GETDATE() 日期时间    ----显示为:2013-07 ...

  3. bzoj 5210 最大连通子块和——动态DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5210 似乎像bzoj4712一样,依然可以用别的方法做.但还是只写了动态DP. 当然是dp[ ...

  4. 序章:为什么学习使用kotlin、及kotlin的一些碎碎念

    为什么使用kotlin? 当然是因为项目目前的开发语言是kotlin啊! 一方面是想能够尽快适应项目,另一方面,kotlin这门语言独特的语法,确实很吸引我,也让我意识到java代码在某些程度上的繁琐 ...

  5. 异常:java.lang.IllegalStateException: No instances found of configserver(里面是一个微服务名)

    今天本地测试代码时出现了个异常,该异常出现的原因是:微服务启动的顺序出现了问题: 应该先启动本地eureka,然后在启动本地配置中心,然后在启动具体的微服务.

  6. CentOS7中配置基于Nginx+Supervisor+Gunicorn的Flask项目

    配置Nginx 1.安装nginx yum install nginx 2.安装好后在/etc/nginx/default.d中添加location的配置,并指向8001端口,以后Gunicorn会监 ...

  7. urllib2模块中文翻译与学习 - Python 2.7.8官方文档

    总结 目的 打开指定网址 要求 了解需要处理的网站的操作流程 数据包的构造与提交 对可能的响应处理选择合适的处理器(模块内的各种 *Handler()) 核心 urllib.urlencode(que ...

  8. android 定位的几种方式介绍

    [地理位置] android 定位的几种方式介绍 开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络 ...

  9. pa14-30条职场经验

    可以说是很多本厚厚的职场经验书籍的精华部分,掌握了这30条可以说是天下无敌了,但真要掌握这30条经验可不是什么容易的事情,他们都是环环相 扣的,一条做不好可能有些能做好的项目就会落空,耐下性子,看看你 ...

  10. Android CTS(frome google)

    Compatibility Test Suite How does the CTS work? The Compatibility Test Suite (CTS) is a free, commer ...