C#内存映射大文件并使用Marshal解析结构体信息
内存映射数据处理类主要函数及变量如下:
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解析结构体信息的更多相关文章
- iOS将大文件映射到内存(读取大文件)
http://blog.csdn.net/xyt243135803/article/details/40995759 在<中国区GPS偏移纠正(适用于Google地图)>一文中曾读取一个7 ...
- 字符设备驱动1:新的方式添加cdev + 在open函数中将文件私有数据指向设备结构体
本例中,驱动入口处,使用cdev_add添加驱动,这点也可与字符设备驱动0:一个简单但完整的字符设备驱动程序对比一下. 另外主要讲xx_open实现文件私有数据指向设备结构体. 引子: 偶然看到,在j ...
- python如何将指定路径下的某类型文件,返回一个树形结构体,让前端显示为树形的目录结构
最近遇到一个问题就是某个linux的目录下有各种文件现在的要求是只需要返回.kml格式的文件,并根据前端要求返回如下结构体即:[{'children': [{'children': [{'title' ...
- windows driver 映射大文件
//如果要做到掉电后仍然可以继续向下操作,可以记录文件的位置重新映射 NTSTATUS status; UNICODE_STRING strFileSrc = RTL_CONSTANT_STRING( ...
- MMAP文件内存映射
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- Java NIO内存映射---上G大文件处理(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...
- 《Java核心技术卷二》笔记(二)文件操作和内存映射文件
文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...
- Java NIO 内存映射文件
Java NIO 内存映射文件 @author ixenos 文件操作的四大方法 前提:内存的访问速度比磁盘高几个数量级,但是基本的IO操作是直接调用native方法获得驱动和磁盘交互的,IO速度限制 ...
- JAVA I/O(三)内存映射文件
<Java编程思想>中对内存映射文件有详细的介绍,此处仅做简单记录和总结.内存映射文件允许创建和修改因为太大而不能放入内存的文件. 1. 内存映射文件简单实例 import java.io ...
随机推荐
- [转] 如何用BSP树生成游戏地图
作者:Timothy Hely 当用对象随机填充某个区域如地下城中的房间时,你可能会遇到的问题是太过随机,导致分布疏密不均或混乱.在本教程中,我将告诉大家如何使用二进制空间划分法(游戏邦注:即Bina ...
- 服务器上传大小限制 --- 来自 FastAdmin 项目开发的引发的问题 (TODO)
服务器上传大小限制 --- 来自 FastAdmin 项目开发的引发的问题 服务器上传有几个地方修改. FastAdmin 的配置. php.ini 的配置. NGINX 的配置.
- vim直接编辑远程文件
本文由Suzzz原创,发布于http://www.cnblogs.com/Suzzz/p/4116341.html,转载请保留此声明. Linux环境下 vim scp://user@hostIP/P ...
- java编程思想第八章多态
前言: 封装:通过合并特征和行为创建新的数据类型. 实现隐藏:通过将细节“私有化”,把接口和实现分离. 多态:消除类型间的耦合关系.也称作动态绑定,后期绑定或运行时绑定. 8.1再论向上转型: 对象既 ...
- linux swap交换分区说明/管理
https://coolnull.com/3699.html 一.SWAP说明1.1 SWAP概述当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释 ...
- docker 摆渡镜像脚本
#!/bin/bash if [ $# != 1 ];then echo "Param error";exit; fi DOCKER_NAME=$1 IMAGE_TAG=${DOC ...
- YUV转换成RGB算法
YUV转换成RGB void yuvtorgb ( double *rgb,unsigned char *yuv) { int i; rgb[] = ] + + ] - ); // r rgb[] = ...
- Angular5学习笔记 - 配置NG-ZORRO(八)
一.在项目中集成组件 $ cd PROJECT_NAME $ npm install ng-zorro-antd --save 二.在项目中导入组件 直接用下面的代码替换 /src/app/app.m ...
- RuPengWang项目
项目 Day1------------------------- 说明:建外键约束.ashx+Razor RupengWang创建三个类库Model DAL BLL后台:RupengWang.Admi ...
- Python内置:items()方法
文章转载于:https://www.cnblogs.com/wushuaishuai/p/7738118.html(博主:IT技术随笔) #Python3中已取消iteritems()方法 描述 Py ...