package com.dahua.netsdk.lib; import com.dahua.netsdk.lib.NetSDKLib.*; import com.dahua.netsdk.lib.enumeration.LastErrorNew; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.Structure; import com.sun.jna.ptr.IntByReference; import java.io.*; import java.math.BigInteger; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; public class ToolKits { static NetSDKLib netsdkapi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configapi = NetSDKLib.CONFIG_INSTANCE; public ToolKits() { } /*************************************************************************************************** * CLIENT_GetNewDevConfig CLIENT_ParseData 和 CLIENT_PacketData CLIENT_SetNewDevConfig 封装 * ***************************************************************************************************/ /** * 获取多个配置 * * @param hLoginHandle 登陆句柄 * @param nChn 通道号,-1 表示全通道 * @param strCmd 配置名称 * @param cmdObjects 配置对应的结构体对象 * @return 成功返回实际获取到的配置个数 */ public static int GetDevConfig(LLong hLoginHandle, int nChn, String strCmd, Structure[] cmdObjects) { IntByReference error = new IntByReference(0); int nBufferLen = 2 * 1024 * 1024; byte[] strBuffer = new byte[nBufferLen]; if (!netsdkapi.CLIENT_GetNewDevConfig(hLoginHandle, strCmd, nChn, strBuffer, nBufferLen, error, 5000,null)) { System.err.printf("Get %s Config Failed!Last Error = %x\n", strCmd, netsdkapi.CLIENT_GetLastError()); return -1; } IntByReference retLength = new IntByReference(0); int memorySize = cmdObjects.length * cmdObjects[0].size(); Pointer objectsPointer = new Memory(memorySize); objectsPointer.clear(memorySize); SetStructArrToPointerData(cmdObjects, objectsPointer); if (!configapi.CLIENT_ParseData(strCmd, strBuffer, objectsPointer, memorySize, retLength.getPointer())) { System.err.println("Parse " + strCmd + " Config Failed!"); return -1; } GetPointerDataToStructArr(objectsPointer, cmdObjects); return (retLength.getValue() / cmdObjects[0].size()); } /** * 获取单个配置 * * @param hLoginHandle 登陆句柄 * @param nChn 通道号,-1 表示全通道 * @param strCmd 配置名称 * @param cmdObject 配置对应的结构体对象 * @return 成功返回 true */ public static boolean GetDevConfig(LLong hLoginHandle, int nChn, String strCmd, Structure cmdObject) { IntByReference error = new IntByReference(0); IntByReference retLen = new IntByReference(0); int nBufferLen = 2 * 1024 * 1024; byte[] strBuffer = new byte[nBufferLen]; if (!netsdkapi.CLIENT_GetNewDevConfig(hLoginHandle, strCmd, nChn, strBuffer, nBufferLen, error, 5000,null)) { System.err.printf("Get %s Config Failed!Last Error = %x\n", strCmd, netsdkapi.CLIENT_GetLastError()); return false; } cmdObject.write(); if (!configapi.CLIENT_ParseData(strCmd, strBuffer, cmdObject.getPointer(), cmdObject.size(), retLen.getPointer())) { System.err.println("Parse " + strCmd + " Config Failed!" + ToolKits.getErrorCode()); return false; } cmdObject.read(); return true; } /** * 设置多个配置 * * @param hLoginHandle 登陆句柄 * @param nChn 通道号,-1 表示全通道 * @param strCmd 配置名称 * @param cmdObjects 配置对应的结构体对象 * @return 成功返回 true */ public static boolean SetDevConfig(LLong hLoginHandle, int nChn, String strCmd, Structure[] cmdObjects) { int nBufferLen = 2 * 1024 * 1024; byte[] szBuffer = new byte[nBufferLen]; for (int i = 0; i < nBufferLen; i++) szBuffer[i] = 0; IntByReference error = new IntByReference(0); IntByReference restart = new IntByReference(0); int memorySize = cmdObjects.length * cmdObjects[0].size(); Pointer objectsPointer = new Memory(memorySize); objectsPointer.clear(memorySize); SetStructArrToPointerData(cmdObjects, objectsPointer); if (!configapi.CLIENT_PacketData(strCmd, objectsPointer, memorySize, szBuffer, nBufferLen)) { System.err.println("Packet " + strCmd + " Config Failed!"); return false; } String strOut = new String(szBuffer).trim(); System.out.println(strOut); if (!netsdkapi.CLIENT_SetNewDevConfig(hLoginHandle, strCmd, nChn, szBuffer, nBufferLen, error, restart, 5000)) { System.err.printf("Set %s Config Failed! Last Error = %x\n", strCmd, netsdkapi.CLIENT_GetLastError()); return false; } return true; } /** * 设置单个配置 * * @param hLoginHandle 登陆句柄 * @param nChn 通道号,-1 表示全通道 * @param strCmd 配置名称 * @param cmdObject 配置对应的结构体对象 * @return 成功返回 true */ public static boolean SetDevConfig(LLong hLoginHandle, int nChn, String strCmd, Structure cmdObject) { boolean result = false; int nBufferLen = 2 * 1024 * 1024; byte szBuffer[] = new byte[nBufferLen]; for (int i = 0; i < nBufferLen; i++) szBuffer[i] = 0; IntByReference error = new IntByReference(0); IntByReference restart = new IntByReference(0); cmdObject.write(); if (configapi.CLIENT_PacketData(strCmd, cmdObject.getPointer(), cmdObject.size(), szBuffer, nBufferLen)) { cmdObject.read(); if (netsdkapi.CLIENT_SetNewDevConfig(hLoginHandle, strCmd, nChn, szBuffer, nBufferLen, error, restart, 5000)) { result = true; } else { System.err.printf("Set %s Config Failed! Last Error = %x\n", strCmd, netsdkapi.CLIENT_GetLastError()); result = false; } } else { System.err.println("Packet " + strCmd + " Config Failed!"); result = false; } return result; } public static void GetPointerData(Pointer pNativeData, Structure pJavaStu) { GetPointerDataToStruct(pNativeData, 0, pJavaStu); } public static void GetPointerDataToStruct(Pointer pNativeData, long OffsetOfpNativeData, Structure pJavaStu) { pJavaStu.write(); Pointer pJavaMem = pJavaStu.getPointer(); pJavaMem.write(0, pNativeData.getByteArray(OffsetOfpNativeData, pJavaStu.size()), 0, pJavaStu.size()); pJavaStu.read(); } public static void GetPointerDataToStructArr(Pointer pNativeData, Structure[] pJavaStuArr) { long offset = 0; for (int i = 0; i < pJavaStuArr.length; ++i) { GetPointerDataToStruct(pNativeData, offset, pJavaStuArr[i]); offset += pJavaStuArr[i].size(); } } /** * 将结构体数组拷贝到内存 * * @param pNativeData * @param pJavaStuArr */ public static void SetStructArrToPointerData(Structure[] pJavaStuArr, Pointer pNativeData) { long offset = 0; for (int i = 0; i < pJavaStuArr.length; ++i) { SetStructDataToPointer(pJavaStuArr[i], pNativeData, offset); offset += pJavaStuArr[i].size(); } } public static void SetStructDataToPointer(Structure pJavaStu, Pointer pNativeData, long OffsetOfpNativeData) { pJavaStu.write(); Pointer pJavaMem = pJavaStu.getPointer(); pNativeData.write(OffsetOfpNativeData, pJavaMem.getByteArray(0, pJavaStu.size()), 0, pJavaStu.size()); } public static void ByteArrToStructure(byte[] pNativeData, Structure pJavaStu) { pJavaStu.write(); Pointer pJavaMem = pJavaStu.getPointer(); pJavaMem.write(0, pNativeData, 0, pJavaStu.size()); pJavaStu.read(); } public static void ByteArrZero(byte[] dst) { // 清零 for (int i = 0; i < dst.length; ++i) { dst[i] = 0; } } //byte转换为byte[2]数组 public static byte[] getByteArray(byte b) { byte[] array = new byte[8]; for (int i = 0; i < 8; i++) { array[i] = (byte) ((b & (1 << i)) > 0 ? 1 : 0); } return array; } public static byte[] getByteArrayEx(byte b) { byte[] array = new byte[8]; for (int i = 7; i >= 0; i--) { array[i] = (byte) (b & 1); b = (byte) (b >> 1); } return array; } public static void StringToByteArr(String src, byte[] dst) { try { byte[] GBKBytes = src.getBytes("GBK"); for (int i = 0; i < GBKBytes.length; i++) { dst[i] = (byte) GBKBytes[i]; } } catch (Exception e1) { e1.printStackTrace(); } } public static long GetFileSize(String filePath) { File f = new File(filePath); if (f.exists() && f.isFile()) { return f.length(); } else { return 0; } } public static boolean ReadAllFileToMemory(String file, Memory mem) { if (mem != Memory.NULL) { long fileLen = GetFileSize(file); if (fileLen <= 0) { return false; } try { File infile = new File(file); if (infile.canRead()) { FileInputStream in = new FileInputStream(infile); int buffLen = 1024; byte[] buffer = new byte[buffLen]; long currFileLen = 0; int readLen = 0; while (currFileLen < fileLen) { readLen = in.read(buffer); mem.write(currFileLen, buffer, 0, readLen); currFileLen += readLen; } in.close(); return true; } else { System.err.println("Failed to open file %s for read!!!\n"); return false; } } catch (Exception e) { System.err.println("Failed to open file %s for read!!!\n"); e.printStackTrace(); } } return false; } public static void savePicture(byte[] pBuf, String sDstFile) { try { FileOutputStream fos = new FileOutputStream(sDstFile); fos.write(pBuf); fos.close(); } catch (Exception e) { e.printStackTrace(); } } public static void savePicture(Pointer pBuf, int dwBufSize, String sDstFile) { try { DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(sDstFile))); out.write(pBuf.getByteArray(0, dwBufSize), 0, dwBufSize); out.close(); } catch (Exception e) { e.printStackTrace(); } } public static void savePicture(Pointer pBuf, int dwBufOffset, int dwBufSize, String sDstFile) { try { DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(sDstFile))); out.write(pBuf.getByteArray(dwBufOffset, dwBufSize), 0, dwBufSize); out.close(); } catch (Exception e) { e.printStackTrace(); } } // 读取本地图片到byte[] public static byte[] readPictureToByteArray(String filename) { File file = new File(filename); if (!file.exists()) { System.err.println("picture is not exist!"); return null; } ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream((int) file.length()); BufferedInputStream byteInStream = null; try { byteInStream = new BufferedInputStream(new FileInputStream(file)); byte[] buf = new byte[1024]; int len = 0; while ((len = byteInStream.read(buf)) != -1) { byteOutStream.write(buf, 0, len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { byteInStream.close(); byteOutStream.close(); } catch (IOException e) { e.printStackTrace(); } } return byteOutStream.toByteArray(); } // 将一位数组转为二维数组 public static byte[][] ByteArrToByteArrArr(byte[] byteArr, int count, int length) { if (count * length != byteArr.length) { System.err.println(count * length + " != " + byteArr.length); return null; } byte[][] byteArrArr = new byte[count][length]; for (int i = 0; i < count; i++) { System.arraycopy(byteArr, i * length, byteArrArr[i], 0, length); } return byteArrArr; } /** * 获取接口错误码 * * @return */ public static String getErrorCode() { return " { error code: ( 0x80000000|" + (netsdkapi.CLIENT_GetLastError() & 0x7fffffff) + " ). 参考 LastError.java }"; } public static String getLastError() { int lastError = netsdkapi.CLIENT_GetLastError(); return "FinalVar.java 对应的错误码 :[0x80000000|" + (lastError & 0x7fffffff) + "]" + "\n" + "十六进制错误码 :[" + String.format("%x", lastError) + "]" + "\n" + "对应中文错误信息为 :[" + LastErrorNew.getChnNoteByValue(lastError) + "]"+ "\n" + "The corresponding English error message is :[" + LastErrorNew.getEngNoteByValue(lastError) + "]"+ "\n"; } /** * 显示目录中文件和子目录 * * @param lLoginID 登陆句柄 * @param szPath 查询的文件路径 * @param stOut 出参 * @return 返回文件/目录信息数组 */ public static SDK_REMOTE_FILE_INFO[] ListRemoteFile(LLong lLoginID, String szPath, NET_OUT_LIST_REMOTE_FILE stOut) { NET_IN_LIST_REMOTE_FILE stIn = new NET_IN_LIST_REMOTE_FILE(); stIn.pszPath = "/mnt/sdcard/" + szPath; stIn.bFileNameOnly = 1; // 只获取文件名称, 不返回文件夹信息, 文件信息中只有文件名有效 stIn.emCondition = NET_REMOTE_FILE_COND.NET_REMOTE_FILE_COND_NONE; int maxFileCount = 50; // 每次查询的文件个数 SDK_REMOTE_FILE_INFO[] remoteFileArr; while (true) { remoteFileArr = new SDK_REMOTE_FILE_INFO[maxFileCount]; for (int i = 0; i < maxFileCount; i++) { remoteFileArr[i] = new SDK_REMOTE_FILE_INFO(); } stOut.nMaxFileCount = maxFileCount; stOut.pstuFiles = new Memory(remoteFileArr[0].size() * maxFileCount); // Pointer初始化 stOut.pstuFiles.clear(remoteFileArr[0].size() * maxFileCount); ToolKits.SetStructArrToPointerData(remoteFileArr, stOut.pstuFiles); // 将数组内存拷贝给Pointer if (netsdkapi.CLIENT_ListRemoteFile(lLoginID, stIn, stOut, 3000)) { if (maxFileCount > stOut.nRetFileCount) { ToolKits.GetPointerDataToStructArr(stOut.pstuFiles, remoteFileArr); // 将Pointer的信息输出到结构体 break; } else { maxFileCount += 50; } } else { return null; } } return remoteFileArr; } /** * 显示目录中文件和子目录 * * @param lLoginID 登陆句柄 * @param szPath 查询的文件路径 * @param stOut 出参 * @return 返回文件/目录信息数组 */ public static SDK_REMOTE_FILE_INFO[] ListAudioFile(LLong lLoginID, String szPath, NET_OUT_LIST_REMOTE_FILE stOut) { NET_IN_LIST_REMOTE_FILE stIn = new NET_IN_LIST_REMOTE_FILE(); stIn.pszPath = szPath; stIn.bFileNameOnly = 1; // 只获取文件名称, 不返回文件夹信息, 文件信息中只有文件名有效 stIn.emCondition = NET_REMOTE_FILE_COND.NET_REMOTE_FILE_COND_NONE; int maxFileCount = 50; // 每次查询的文件个数 SDK_REMOTE_FILE_INFO[] remoteFileArr; while (true) { remoteFileArr = new SDK_REMOTE_FILE_INFO[maxFileCount]; for (int i = 0; i < maxFileCount; i++) { remoteFileArr[i] = new SDK_REMOTE_FILE_INFO(); } stOut.nMaxFileCount = maxFileCount; stOut.pstuFiles = new Memory(remoteFileArr[0].size() * maxFileCount); // Pointer初始化 stOut.pstuFiles.clear(remoteFileArr[0].size() * maxFileCount); ToolKits.SetStructArrToPointerData(remoteFileArr, stOut.pstuFiles); // 将数组内存拷贝给Pointer if (netsdkapi.CLIENT_ListRemoteFile(lLoginID, stIn, stOut, 3000)) { if (maxFileCount > stOut.nRetFileCount) { ToolKits.GetPointerDataToStructArr(stOut.pstuFiles, remoteFileArr); // 将Pointer的信息输出到结构体 break; } else { maxFileCount += 50; } } else { return null; } } return remoteFileArr; } /** * 删除文件或目录,删除具体的文件或者一类文件 * * @param lLoginID 登陆句柄 * @param szPath 删除的文件名称 */ public static boolean RemoveRemoteFilesEx(LLong lLoginID, String szPath) { boolean bRet = false; if (szPath.indexOf("*") != -1) { // 删除一类文件 String[] szPathStr = szPath.split("[*]"); String szFindPath = szPathStr[0]; // 查询文件路径 String szFileType = szPathStr[1].substring(1); // 文件类型 // 查询当前路径下的文件 NET_OUT_LIST_REMOTE_FILE stOut = new NET_OUT_LIST_REMOTE_FILE(); SDK_REMOTE_FILE_INFO[] remoteFile = ToolKits.ListRemoteFile(lLoginID, szFindPath, stOut); if (remoteFile != null) { for (int i = 0; i < stOut.nRetFileCount; i++) { // 过滤并删除 if (new String(remoteFile[i].szPath).trim().indexOf(szFileType) != -1) { bRet = RemoveRemoteFiles(lLoginID, szFindPath + new String(remoteFile[i].szPath).trim()); } } } } else { // 删除具体的文件 bRet = RemoveRemoteFiles(lLoginID, szPath); } return bRet; } /** * 删除多个文件或目录 * * @param lLoginID 登陆句柄 * @param szPath 删除的文件名称 * @return true 成功; false 失败 */ public static boolean RemoveRemoteFilesArr(LLong lLoginID, String[] szPath) { FILE_PATH[] filePath = new FILE_PATH[szPath.length]; for (int i = 0; i < szPath.length; i++) { filePath[i] = new FILE_PATH(); } for (int i = 0; i < szPath.length; i++) { filePath[i].pszPath = "/mnt/sdcard/" + szPath[i]; System.out.println("/mnt/sdcard/" + szPath[i]); } // 入参 NET_IN_REMOVE_REMOTE_FILES stIn = new NET_IN_REMOVE_REMOTE_FILES(); stIn.nFileCount = szPath.length; stIn.pszPathPointer = new Memory(filePath[0].size() * szPath.length); stIn.pszPathPointer.clear(filePath[0].size() * szPath.length); ToolKits.SetStructArrToPointerData(filePath, stIn.pszPathPointer); // 出参 NET_OUT_REMOVE_REMOTE_FILES stOut = new NET_OUT_REMOVE_REMOTE_FILES(); boolean bRet = netsdkapi.CLIENT_RemoveRemoteFiles(lLoginID, stIn, stOut, 3000); return bRet; } /** * 删除单个文件或目录 * * @param lLoginID 登陆句柄 * @param szPath 删除的文件名称 * @return true 成功; false 失败 */ public static boolean RemoveAudioFiles(LLong lLoginID, String szPath) { FILE_PATH filePath = new FILE_PATH(); filePath.pszPath = szPath; // 入参 NET_IN_REMOVE_REMOTE_FILES stIn = new NET_IN_REMOVE_REMOTE_FILES(); stIn.nFileCount = 1; stIn.pszPathPointer = filePath.getPointer(); // 出参 NET_OUT_REMOVE_REMOTE_FILES stOut = new NET_OUT_REMOVE_REMOTE_FILES(); filePath.write(); boolean bRet = netsdkapi.CLIENT_RemoveRemoteFiles(lLoginID, stIn, stOut, 3000); filePath.read(); return bRet; } /** * 删除单个文件或目录 * * @param lLoginID 登陆句柄 * @param szPath 删除的文件名称 * @return true 成功; false 失败 */ public static boolean RemoveRemoteFiles(LLong lLoginID, String szPath) { FILE_PATH filePath = new FILE_PATH(); filePath.pszPath = "/mnt/sdcard/" + szPath; // 入参 NET_IN_REMOVE_REMOTE_FILES stIn = new NET_IN_REMOVE_REMOTE_FILES(); stIn.nFileCount = 1; stIn.pszPathPointer = filePath.getPointer(); // 出参 NET_OUT_REMOVE_REMOTE_FILES stOut = new NET_OUT_REMOVE_REMOTE_FILES(); filePath.write(); boolean bRet = netsdkapi.CLIENT_RemoveRemoteFiles(lLoginID, stIn, stOut, 3000); filePath.read(); return bRet; } /** * 获取播放盒上全部节目信息 * * @param lLoginID d登陆句柄 * @param stOut 出参 * @return 返回播放盒节目信息数组 */ public static NET_PROGRAM_ON_PLAYBOX[] GetAllProgramOnPlayBox(LLong lLoginID, NET_OUT_GET_ALL_PLAYBOX_PROGRAM stOut) { // 入参 NET_IN_GET_ALL_PLAYBOX_PROGRAM stIn = new NET_IN_GET_ALL_PLAYBOX_PROGRAM(); NET_PROGRAM_ON_PLAYBOX[] playboxArr; int maxProgramCount = 10; // 每次查询的节目信息个数 while (true) { playboxArr = new NET_PROGRAM_ON_PLAYBOX[maxProgramCount]; for (int i = 0; i < maxProgramCount; i++) { playboxArr[i] = new NET_PROGRAM_ON_PLAYBOX(); for (int j = 0; j < NetSDKLib.MAX_WINDOWS_COUNT; j++) { // 申请一块内存,自己设置,设置大点 playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].pstElementsBuf = new Memory(100 * 1024); playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].pstElementsBuf.clear(100 * 1024); playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].nBufLen = 100 * 1024; } } // 出参 stOut.nMaxProgramCount = maxProgramCount; stOut.pstProgramInfo = new Memory(playboxArr[0].size() * maxProgramCount); stOut.pstProgramInfo.clear(playboxArr[0].size() * maxProgramCount); ToolKits.SetStructArrToPointerData(playboxArr, stOut.pstProgramInfo); // 将数组内存拷贝给Pointer if (netsdkapi.CLIENT_GetAllProgramOnPlayBox(lLoginID, stIn, stOut, 3000)) { if (maxProgramCount > stOut.nRetProgramCount) { ToolKits.GetPointerDataToStructArr(stOut.pstProgramInfo, playboxArr); // 将Pointer的信息输出到结构体 break; } else { maxProgramCount += 10; } } else { return null; } } return playboxArr; } /** * 批量删除节目信息 * * @param lLoginID 登陆句柄 * @param szProGrammeIdList 需要删除的节目ID * @return true 成功; false 失败 */ public static boolean DelMultiProgrammesById(LLong lLoginID, String[] szProGrammeIdList) { // 入参 NET_IN_DEL_PROGRAMMES stIn = new NET_IN_DEL_PROGRAMMES(); stIn.nProgrammeID = szProGrammeIdList.length; // 需要删除的节目ID个数 for (int i = 0; i < szProGrammeIdList.length; i++) { System.arraycopy(szProGrammeIdList[i].getBytes(), 0, stIn.szProGrammeIdListArr[i].szProGrammeIdList, 0, szProGrammeIdList[i].getBytes().length); } // 出参 NET_OUT_DEL_PROGRAMMES stOut = new NET_OUT_DEL_PROGRAMMES(); return netsdkapi.CLIENT_DelMultiProgrammesById(lLoginID, stIn, stOut, 5000); } /** * 删除多个节目计划 * * @param lLoginID 登陆句柄 * @param szPlanID 需要删除的计划ID * @return true 成功; false 失败 */ public static boolean DelMultiProgrammePlans(LLong lLoginID, String[] szPlanID) { // 入参 NET_IN_DEL_PROGRAMMEPLANS stIn = new NET_IN_DEL_PROGRAMMEPLANS(); stIn.nPlanID = szPlanID.length; // 节目计划ID个数 for (int i = 0; i < szPlanID.length; i++) { System.arraycopy(szPlanID[i].getBytes(), 0, stIn.szPlanIDArr[i].szPlanID, 0, szPlanID[i].getBytes().length); } // 出参 NET_OUT_DEL_PROGRAMMEPLANS stOut = new NET_OUT_DEL_PROGRAMMEPLANS(); return netsdkapi.CLIENT_DelMultiProgrammePlans(lLoginID, stIn, stOut, 5000); } /** * 获取所有节目计划信息 * * @param lLoginID 登陆句柄 * @param stOut 出参 * @return NET_PROGRAMME_PLANS_INFO 结构体 */ public static NET_PROGRAMME_PLANS_INFO GetAllProgrammePlans(LLong lLoginID, NET_OUT_GET_ALL_PROGRAMMEPLANS stOut) { // 入参 NET_IN_GET_ALL_PROGRAMMEPLANS stIn = new NET_IN_GET_ALL_PROGRAMMEPLANS(); NET_PROGRAMME_PLANS_INFO planInfo; int maxPlanCnt = 10; // 每次查询的计划个数 while (true) { planInfo = new NET_PROGRAMME_PLANS_INFO(maxPlanCnt); // 出参 stOut.nMaxPlanCnt = maxPlanCnt; stOut.pstImmePlan = new Memory(stOut.nMaxPlanCnt * planInfo.szImmePlan[0].size()); stOut.pstImmePlan.clear(stOut.nMaxPlanCnt * planInfo.szImmePlan[0].size()); stOut.pstTimerPlan = new Memory(stOut.nMaxPlanCnt * planInfo.szTimerPlan[0].size()); stOut.pstTimerPlan.clear(stOut.nMaxPlanCnt * planInfo.szTimerPlan[0].size()); ToolKits.SetStructArrToPointerData(planInfo.szImmePlan, stOut.pstImmePlan); // 将数组内存拷贝给Pointer ToolKits.SetStructArrToPointerData(planInfo.szTimerPlan, stOut.pstTimerPlan); // 将数组内存拷贝给Pointer if (netsdkapi.CLIENT_GetAllProgrammePlans(lLoginID, stIn, stOut, 3000)) { if (maxPlanCnt > stOut.nRetImmCnt && maxPlanCnt > stOut.nRetTimerCnt) { ToolKits.GetPointerDataToStructArr(stOut.pstImmePlan, planInfo.szImmePlan); // 将Pointer的值输出到数组 ToolKits.GetPointerDataToStructArr(stOut.pstTimerPlan, planInfo.szTimerPlan); // 将Pointer的值输出到数组 break; } else { maxPlanCnt += 10; } } else { return null; } } return planInfo; } // Win下,将GBK String类型的转为Pointer public static Pointer GetGBKStringToPointer(String src) { Pointer pointer = null; try { byte[] b = src.getBytes("GBK"); pointer = new Memory(b.length + 1); pointer.clear(b.length + 1); pointer.write(0, b, 0, b.length); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return pointer; } // win下,将Pointer值转为 GBK String public static String GetPointerDataToGBKString(Pointer pointer) { String str = ""; if (pointer == null) { return str; } int length = 0; byte[] bufferPlace = new byte[1]; for (int i = 0; i < 2048; i++) { pointer.read(i, bufferPlace, 0, 1); if (bufferPlace[0] == '\0') { length = i; break; } } if (length > 0) { byte[] buffer = new byte[length]; pointer.read(0, buffer, 0, length); try { str = new String(buffer, "GBK").trim(); } catch (UnsupportedEncodingException e) { return str; } } return str; } // win下,将Pointer值转为 GBK String public static String GetPointerDataToGBKString(Pointer pointer, int length) { String str = ""; if (pointer == null) { return str; } if (length > 0) { byte[] buffer = new byte[length]; pointer.read(0, buffer, 0, length); try { str = new String(buffer, "GBK").trim(); } catch (UnsupportedEncodingException e) { return str; } } return str; } public static void StringToByteArray(String src, byte[] dst) { for (int i = 0; i < dst.length; i++) { dst[i] = 0; } System.arraycopy(src.getBytes(), 0, dst, 0, src.getBytes().length); } /** * 生成MD5 * * @param path 图片路径 * @return MD5 * @throws FileNotFoundException */ public static String GetStringMD5(String path) { File file = new File(path); String value = ""; FileInputStream inputStream = null; try { inputStream = new FileInputStream(file); MappedByteBuffer byteBuffer = inputStream.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length()); MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(byteBuffer); BigInteger bi = new BigInteger(1, md5.digest()); value = bi.toString(16); } catch (Exception e) { e.printStackTrace(); } finally { if (null != inputStream) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return value; } /** * 写入流数据 * * @param stream * @return */ public static Pointer setStreamToPointer(InputStream stream) { Pointer pointer = null; try { int size = stream.available(); pointer = new Memory(size); byte[] data = new byte[size]; stream.read(data); pointer.write(0, data, 0, size); } catch (IOException e) { e.printStackTrace(); } finally { return pointer; } } }