/// <summary> /// 获取文件的Title /// </summary> /// <param name="fileData">文件数据</param> /// <param name="fileSize">文件大小</param> private static string GetFileTitle(byte[] fileData, int fileSize) { try { IntPtr retptr = IntPtr.Zero; int datasize = 0; if (CommonMethod.Is64BitVersion()) { retptr = SPAGetFileTitle64(fileData, fileSize, ref datasize); } else { retptr = SPAGetFileTitle32(fileData, fileSize, ref datasize); } byte[] copybytes = CommonMethod.CopyDataArrayFromIntptrAndFree <byte>(ref retptr, datasize); if (copybytes == null) { return(null); } return(CommonMethod.CovertByteArrayToString(copybytes, Encoding.Default)); } catch (Exception ex) { ErrorString = ex.Message; return(null); } }
private static byte[] CreateFile(SPAHeader xPara, InstrumentHeader instPara, double[] yDatas, string fileTitle, string instSN) { IntPtr retptr = IntPtr.Zero; int datasize = 0; try { byte[] titleBytes = null; if (!string.IsNullOrWhiteSpace(fileTitle)) { titleBytes = Encoding.Default.GetBytes(fileTitle); } if (CommonMethod.Is64BitVersion()) { retptr = SPACreateFile64(ref xPara, ref instPara, yDatas, titleBytes, titleBytes == null ? 0 : titleBytes.Length, instSN, ref datasize); } else { retptr = SPACreateFile32(ref xPara, ref instPara, yDatas, titleBytes, titleBytes == null ? 0 : titleBytes.Length, instSN, ref datasize); } return(CommonMethod.CopyDataArrayFromIntptrAndFree <byte>(ref retptr, datasize)); } catch (Exception ex) { ErrorString = ex.Message; return(null); } }
/// <summary> /// 获取文件的仪器序列号 /// </summary> /// <param name="fileData">文件数据</param> /// <param name="fileSize">文件大小</param> private static string GetInstSN(byte[] fileData, int fileSize) { try { IntPtr retptr = IntPtr.Zero; int datasize = 0; if (CommonMethod.Is64BitVersion()) { retptr = SPAGetInstSN64(fileData, fileSize, ref datasize); } else { retptr = SPAGetInstSN32(fileData, fileSize, ref datasize); } byte[] copybytes = CommonMethod.CopyDataArrayFromIntptrAndFree <byte>(ref retptr, datasize); if (copybytes == null) { return(null); } return(Encoding.UTF8.GetString(copybytes)); } catch (Exception ex) { ErrorString = ex.Message; return(null); } }
/// <summary> /// 创建光谱文件块 /// </summary> /// <param name="sampleCode">样品编号</param> /// <param name="index">光谱序号</param> /// <param name="fileTime">光谱创建时间</param> /// <param name="yDatas">y轴数据</param> /// <param name="compDatas">浓度数据</param> /// <returns></returns> private static byte[] CreateFileData(string sampleCode, int index, DateTime fileTime, double[] yDatas, double[] compDatas) { try { IntPtr retptr = IntPtr.Zero; UInt32 time = CreateFileDateTime(fileTime); //处理样品编号 byte[] codeBytes = StringToBytesArray(sampleCode, SAMPLECODELEN); byte[] IDBytes = StringToBytesArray(sampleCode, SAMPLEIDLEN); //因为样品编号位数比较少,因此在sampleID里面保存一份长的 int dataSize = 0; if (CommonMethod.Is64BitVersion()) { retptr = FossCreateFileData64(codeBytes, (UInt16)index, time, yDatas, (UInt32)yDatas.Length, compDatas, compDatas == null ? 0 : (UInt32)compDatas.Length, IDBytes, ref dataSize); } else { retptr = FossCreateFileData32(codeBytes, (UInt16)index, time, yDatas, (UInt32)yDatas.Length, compDatas, compDatas == null ? 0 : (UInt32)compDatas.Length, IDBytes, ref dataSize); } return(CommonMethod.CopyDataArrayFromIntptrAndFree <byte>(ref retptr, dataSize)); } catch (Exception ex) { ErrorString = ex.Message; return(null); } }
/// <summary> /// 读取浓度数据 /// </summary> /// <param name="fileData">文件数据</param> /// <param name="index">光谱序号</param> /// <returns>返回光谱浓度数据</returns> public static double[] GetComponentData(byte[] fileData, int index) { try { IntPtr retptr = IntPtr.Zero; int datasize = 0; if (CommonMethod.Is64BitVersion()) { retptr = FossGetComponentData64(fileData, fileData.Length, index, ref datasize); } else { retptr = FossGetComponentData32(fileData, fileData.Length, index, ref datasize); } double[] retDatas = CommonMethod.CopyDataArrayFromIntptrAndFree <double>(ref retptr, datasize); if (retDatas == null) { ErrorString = CommonMethod.ErrorString; return(null); } return(retDatas); } catch (Exception ex) { ErrorString = ex.Message; return(null); } }
/// <summary> /// 读取X轴数据 /// </summary> private static double[] GetXData(byte[] fileData, int fileSize, int subIndex) { IntPtr retptr = IntPtr.Zero; int datasize = 0; if (CommonMethod.Is64BitVersion()) { retptr = SPCGetXDatas64(fileData, fileSize, subIndex, ref datasize); } else { retptr = SPCGetXDatas32(fileData, fileSize, subIndex, ref datasize); } float[] tempdatas = CommonMethod.CopyDataArrayFromIntptrAndFree <float>(ref retptr, datasize); if (tempdatas == null) { return(null); } double[] retdatas = new double[tempdatas.Length]; for (int i = 0; i < retdatas.Length; i++) { retdatas[i] = tempdatas[i]; } return(retdatas); }
/// <summary> /// 创建SPC文件 /// </summary> /// <param name="mainHeader">文件结构</param> /// <param name="subTypes">子数据类型</param> /// <param name="dataPoints">各数据的数量</param> /// <param name="xDatas">X轴数据,可以为NULL</param> /// <param name="yDatas">Y轴数据,一条或者多条,列=mainHeader->fnpts, 行=subTypes.Length</param> /// <param name="logText">光谱采集参数</param> /// <param name="logBinary">私有数据</param> /// <returns>SPC内容</returns> private static byte[] CreateCommonXFile(SPCHeader mainHeader, byte[] subTypes, int[] dataPoints, float[] xDatas, float[] yDatas, byte[] logText, byte[] logBinary) { //xDatas=NULL表示等间距X轴 if (xDatas == null && mainHeader.fnpts <= 0 || yDatas == null || logText == null || logText.Length == 0) { return(null); } if (xDatas == null) //没有X轴数据,就不能有dataPoints { dataPoints = null; if (yDatas.Length != mainHeader.fnpts * mainHeader.fnsub) //Y轴数据必须与文件数量和每个文件的数据点数相符 { return(null); } } else { if (dataPoints == null) //如果没有dataPoints,表示只有一个xDatas,由所有Y轴共享 { if (xDatas.Length != mainHeader.fnpts || yDatas.Length != mainHeader.fnpts * mainHeader.fnsub) { return(null); } } else //每个Y都对应不同的X { mainHeader.fnpts = 0; mainHeader.fnsub = (uint)dataPoints.Length; int count = dataPoints.Sum(); if (xDatas.Length != count || yDatas.Length != count) { return(null); } } } IntPtr retptr = IntPtr.Zero; int datasize = 0; if (CommonMethod.Is64BitVersion()) { retptr = SPCCreateFile64(ref mainHeader, subTypes, dataPoints, xDatas, yDatas, logText, logText == null ? 0 : logText.Length, logBinary, logBinary == null ? 0 : logBinary.Length, ref datasize); } else { retptr = SPCCreateFile32(ref mainHeader, subTypes, dataPoints, xDatas, yDatas, logText, logText == null ? 0 : logText.Length, logBinary, logBinary == null ? 0 : logBinary.Length, ref datasize); } return(CommonMethod.CopyDataArrayFromIntptrAndFree <byte>(ref retptr, datasize)); }
/// <summary> /// 读取变量的数据 /// </summary> /// <param name="fileData">文件数据</param> /// <param name="variableInfo">需要读取的变量信息</param> /// <returns>变量的数据</returns> public static T[] GetVariableData <T>(byte[] fileData, MatVariableInfo variableInfo) where T : IComparable { if (fileData == null || fileData.Length == 0) { return(null); } try { IntPtr retptr = IntPtr.Zero; int datasize = 0; //返回的是byte大小 if (CommonMethod.Is64BitVersion()) { retptr = MATGetVariableData64(fileData, fileData.Length, ref variableInfo, ref datasize); } else { retptr = MATGetVariableData32(fileData, fileData.Length, ref variableInfo, ref datasize); } if (retptr == IntPtr.Zero) { return(null); } //按照数据类型来拷贝返回数据 int typesize = Marshal.SizeOf(typeof(T)); if ((datasize % typesize) != 0) { Marshal.FreeCoTaskMem(retptr); return(null); } datasize = datasize / typesize; return(CommonMethod.CopyDataArrayFromIntptrAndFree <T>(ref retptr, datasize)); } catch (Exception ex) { ErrorString = ex.Message; return(null); } }
/// <summary> /// 读取Y轴数据 /// </summary> /// <param name="fileData"></param> /// <param name="fileSize"></param> /// <returns></returns> private static double[] GetYData(byte[] fileData, int fileSize) { try { IntPtr retptr = IntPtr.Zero; int datasize = 0; if (CommonMethod.Is64BitVersion()) { retptr = SPAGetYDatas64(fileData, fileSize, ref datasize); } else { retptr = SPAGetYDatas32(fileData, fileSize, ref datasize); } return(CommonMethod.CopyDataArrayFromIntptrAndFree <double>(ref retptr, datasize)); } catch (Exception ex) { ErrorString = ex.Message; return(null); } }
/// <summary> /// 创建光谱文件块 /// </summary> /// <param name="fileCount">文件数量</param> /// <param name="fileTime">光谱创建时间</param> /// <param name="specCols">光谱数据点数量</param> /// <param name="firstX">起始波数</param> /// <param name="lastX">结束波数</param> /// <param name="compNames">组分名称</param> /// <param name="title">文件描述</param> /// <param name="instrument">仪器名称</param> /// <param name="serialNo">仪器序列号</param> /// <returns></returns> private static byte[] CreateMainHeader(int fileCount, DateTime fileTime, int specCols, double firstX, double lastX, string[] compNames, string title, string instrument, string serialNo) { try { IntPtr retptr = IntPtr.Zero; int datasize = 0; //创建主结构 UInt32 time = CreateFileDateTime(fileTime); int compCount = compNames == null ? 0 : compNames.Length; //组分数量 if (CommonMethod.Is64BitVersion()) { retptr = FossCreateMainHeader64((UInt32)fileCount, (UInt32)specCols, time, firstX, lastX, compCount, ref datasize); } else { retptr = FossCreateMainHeader32((UInt32)fileCount, (UInt32)specCols, time, firstX, lastX, compCount, ref datasize); } byte[] headerDatas = CommonMethod.CopyDataArrayFromIntptrAndFree <byte>(ref retptr, datasize); if (headerDatas == null) { ErrorString = CommonMethod.ErrorString; return(null); } //文件描述 if (!string.IsNullOrWhiteSpace(title)) { if (AddMainHeaderInfo(headerDatas, MAIN_TITLE, Encoding.Default.GetBytes(title)) == false) { return(null); } } //仪器描述 if (!string.IsNullOrWhiteSpace(instrument)) { if (AddMainHeaderInfo(headerDatas, MAIN_INSTRUMENT, Encoding.Default.GetBytes(instrument)) == false) { return(null); } } //仪器序列号 if (!string.IsNullOrWhiteSpace(serialNo)) { if (AddMainHeaderInfo(headerDatas, MAIN_SERIALNO, Encoding.Default.GetBytes(serialNo)) == false) { return(null); } } //组分信息 if (compNames != null && compNames.Length != 0) { byte[] compBytes = new byte[compNames.Length * CompNameLength]; //一个组分长度为CompNameLength for (int i = 0; i < compNames.Length; i++) { var namebytes = StringToBytesArray(compNames[i], CompNameLength); Array.Copy(namebytes, 0, compBytes, i * CompNameLength, CompNameLength); } if (AddMainHeaderInfo(headerDatas, MAIN_COMPONENT, compBytes) == false) { return(null); } } return(headerDatas); } catch (Exception ex) { ErrorString = ex.Message; return(null); } }