C#对接C++,回调函数返回IntPtr事件信息转成结构体时出错 5C

C#对接C++,回调函数返回IntPtr事件信息转成结构体时出错,指定结构必须能直接复制到本机结构中,或是具有布局信息。
private int RealLoadPicCallback(IntPtr lAnalyzerHandle, uint dwEventType, IntPtr pEventInfo, IntPtr pBuffer, uint dwBufSize, IntPtr dwUser, int nSequence, IntPtr reserved)
{
ZN_ALARM_TYPE type = (ZN_ALARM_TYPE)dwEventType;
switch (type)
{
case ZN_ALARM_TYPE.EVENT_IVS_CROSSLINEDETECTION:

                DEV_EVENT_CROSSLINE_INFO eventInfo = new DEV_EVENT_CROSSLINE_INFO();

                Marshal.Copy(pBuffer, data, 0, (int)dwBufSize);

                try
                {
                    var obj = Marshal.PtrToStructure(pEventInfo, typeof(DEV_EVENT_CROSSLINE_INFO));
                    eventInfo = null;
                }
                catch (Exception ex)
                {

                    throw ex;
                }

                break;
            default:
                // Console.WriteLine(lCommand.ToString("X"));
                break;
        }


        return 0;
    }

            结构体DEV_EVENT_CROSSLINE_INFO是只需要第一个nChannelID,所以将其他的字段合在buffer大小是1956
             public class DEV_EVENT_CROSSLINE_INFO
{
    public int nChannelID;               // 通道号
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1956)]
    public byte[] buffer;

    //public char szName;          
    //public char bReserved1;             
    //public double PTS;                           
    //public NET_TIME_EX UTC;                          
    //public int nEventID;                         
    //public DH_MSG_OBJECT stuObject;                       
    //public DH_EVENT_FILE_INFO stuFileInfo;                  
    //public DH_POINT DetectLine;                      
    //public int nDetectLineNum;                    
    //public DH_POINT TrackLine;   
    //public int nTrackLineNum;                  
    //public byte bEventAction;                       
    //public byte bDirection;                     
    //public byte byReserved;
    //public byte byImageIndex;                   
    //public uint dwSnapFlagMask;                    
    //public int nSourceIndex;                   
    //public char szSourceDevice;          
    //public int nOccurrenceCoun;             
    //public EVENT_INTELLI_COMM_INFO stuIntelliCommInfo;     
    //public byte bReserved;              
}

1个回答

SizeConst = 1956
你确认长度对么

报什么错

shangshang_A
shangshang_A 我用sizeof看了他的长度,整个结构体的长度是1960,nChannelID是int类型,所以1956应该没有问题,报的错误是指定结构必须能直接复制到本机结构中,或是具有布局信息
6 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C#对接C++,回调函数返回IntPtr事件信息转成结构体时出错
C#对接C++,回调函数返回IntPtr事件信息转成结构体时出错,指定结构必须能直接复制到本机结构中,或是具有布局信息。 private int RealLoadPicCallback(IntPtr lAnalyzerHandle, uint dwEventType, IntPtr pEventInfo, IntPtr pBuffer, uint dwBufSize, IntPtr dwUser, int nSequence, IntPtr reserved) { ZN_ALARM_TYPE type = (ZN_ALARM_TYPE)dwEventType; switch (type) { case ZN_ALARM_TYPE.EVENT_IVS_CROSSLINEDETECTION: DEV_EVENT_CROSSLINE_INFO eventInfo = new DEV_EVENT_CROSSLINE_INFO(); Marshal.Copy(pBuffer, data, 0, (int)dwBufSize); try { var obj = Marshal.PtrToStructure(pEventInfo, typeof(DEV_EVENT_CROSSLINE_INFO)); eventInfo = null; } catch (Exception ex) { throw ex; } break; default: // Console.WriteLine(lCommand.ToString("X")); break; } return 0; } 结构体DEV_EVENT_CROSSLINE_INFO是只需要第一个nChannelID,所以将其他的字段合在buffer大小是1956 public class DEV_EVENT_CROSSLINE_INFO { public int nChannelID; // 通道号 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1956)] public byte[] buffer; //public char szName; //public char bReserved1; //public double PTS; //public NET_TIME_EX UTC; //public int nEventID; //public DH_MSG_OBJECT stuObject; //public DH_EVENT_FILE_INFO stuFileInfo; //public DH_POINT DetectLine; //public int nDetectLineNum; //public DH_POINT TrackLine; //public int nTrackLineNum; //public byte bEventAction; //public byte bDirection; //public byte byReserved; //public byte byImageIndex; //public uint dwSnapFlagMask; //public int nSourceIndex; //public char szSourceDevice; //public int nOccurrenceCoun; //public EVENT_INTELLI_COMM_INFO stuIntelliCommInfo; //public byte bReserved; }
C# IntPtr转结构体问题
在C#不支持Marshal(非Windows系统)的情况下,怎么将Intptr转结构体?
C#结构体转换成IntPtr问题
tPlaybackCapture ntpc =new tPlaybackCapture(); IntPtr sp = Marshal.AllocHGlobal(Marshal.SizeOf(ntpc)); Marshal.StructureToPtr(ntpc, sp, false); 这样转换出现System.ArgumentException异常 异常的提示为Additional information: Type could not be marshaled because the length of an embedded array instance does not match the declared length in the layout. 哪位大神帮忙解决一下啊,感激不尽!!!!
C#调用dll,使用intPtr接收char*返回值不一致
在C#中调用C的dll,遇到char* 使用 intPtr接收,返回值与C中char 指针不一致 C结构体 typedef struct { BYTE ErrCode; int* errstring; } ERRPARAMS; 函数 BYTE DSCUDAPICALL dscGetLastError(ERRPARAMS* errparams); C#结构体 [StructLayout(LayoutKind.Sequential)] public struct ERRPARAMS { public byte ErrCode; public IntPtr errstring; } 函数 [DllImport("dscud.dll", EntryPoint = "dscGetLastError", CharSet = CharSet.Unicode, SetLastError = false, CallingConvention = CallingConvention.Cdecl)] extern unsafe public static byte dscGetLastError(ERRPARAMS* errparams); 执行结果: 在C中 ErrCode是5 errstring是0x1007eb80 可以转换成字符串 在C#中 ErrCode是5 errstring是0x00000010 使用Marshal.PtrToStringAnsi转换为空,不是想要的地址 将intPtr改成string/String/StringBuilder/char[]都试过了,函数会报内存异常的错误。 且大神解答,非常感谢。
c#调用c++的dll文件时,存在调用继承了另一个类的回到函数如何调用?
![图片说明](https://img-ask.csdn.net/upload/201911/27/1574817535_261789.png) 在调用此回调函数时,写了委托但是没有调用成功 下面是委托代码 ``` [UnmanagedFunctionPointerAttribute(CallingConvention.StdCall, CharSet = CharSet.Ansi)] public delegate void CCallbackImp(int nEventID, structure.CR_Event pEvent); ``` 下面是调用dll注册回到函数代码 ``` [DllImport(@"CRInterface.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "CR_RegisterEventCallback")] public extern unsafe static int CR_RegisterEventCallback(CCallbackImp pCallback); ``` 回调函数具体代码 ``` public static void CallBackFunction(int nEventID, structure.CR_Event pEvent) { MessageBox.Show("进入回调函数"+nEventID.ToString()); if (nEventID == (int)structure.CR_EventID.CR_EVT_NEW_FRAME) { MessageBox.Show(nEventID.ToString()); } } ``` 接口原理是当执行以下代码是,dll会自动调用回调函数,然后执行会到函数中的代码 ``` resultprop = ImportDll.CR_StartAcquisition(cDETR_IDX, cFRM_NUM,(IntPtr) nBufSize, 1); ``` 但是最后不知道哪儿错误了,么有进入回调函数中
C#返回byte[]给dll的方法,寻求帮助
谁能帮下我。我是新手中的新手,第一次用C++,目前只想解决这个问题 我现在的需求是,DLL里调用了C#的委托函数,委托函数返回字节数组给DLL,DLL再接下去处理 这个C#的委托函数的代码 static IntPtr sendDataFun(IntPtr buf, int len) { byte[] buffer = new byte[len]; Marshal.Copy(buf, buffer, 0, len); //此处是各种处理。。省略 //获取buffer字节数组的内存地址 IntPtr pin = GCHandle.ToIntPtr(GCHandle.Alloc(buffer)); return pin;//把内存地址返回给DLL } 这里是C++ 写的DLL代码 //这行前面的int 类型应该改成什么才能接收C#返回IntPtr类型 typedef int (WINAPI *mhook_func)(char* buf, int len);//这个结构就是下面_msend函数的 int WINAPI send(const char *buf, int len) { char *temp = new char[len]; memcpy_s(temp, len, buf, len); //_msend就是C#的委托函数(sendDataFun),先将temp和len发送给C#的处理,再返回字节数组,再转成 char * char * aa = _msend(temp, len);//这里要怎么做才能把C#返回的IntPtr指针内容读取并转成char * //重点在这一部分。怎么实现我要的功能 //第一个参数aa就是上面上行从C#返回的字节数组的char * int ret = g_trueSend(aa, len); delete temp; } 谢谢大家,我对C++不了解,希望能好人做到底,在我的基础上改代码,给提示我,我也不懂的,免得若大家烦。
c#调用DLL回调函数问题,硬盘录像机,NetSdk.dll,H264_DVR
最近使用C#编写一个摄像头的本地监控及录像程序,硬件开发商把所有的功能实现封装到DLL里了,我通过C#调用之。 具体要实现的功能如下: 1、摄像头通过DAS功能,主动向监控主机的IP发送数据。 2、监控主机监听固定端口,处理接收到的数据。 我自己的思路: 1、新建一个Dictionary存储已上线设备的信息。 2、程序初始化H264_DVR_Init(DisCallback, 0),DisCallback为断线回调函数,设备断线后将设备信息从Dictionary剔除。 3、程序通过调用DLL中的H264_DVR_StartActiveRigister(port, ActiveRegCallBack, 0))方法开始监听端口,ActiveRegCallBack为设备上线后的回调函数,能够得到上线设备的信息。 遇到的问题: 现在程序能够正常的运行,设备发送数据也能接受并显示,但是如果有一个已连接的设备断线后,当这个设备再次连接时或新设备上线时程序就崩溃,显示VSHOST32.EXE已停止工作,即使关闭项目属性中“启用visual studio承载进程”后也会崩溃。 现将部分代码贴上,感谢大神!跪谢! //---------------------------------------------------------------------------------------------------- //初始化SDK public void InitSDK() { DisCallback = new XMSDK.DisConnectCallBackDelegate(DisConnectBackCall); GC.KeepAlive(DisCallback); if (XMSDK.H264_DVR_Init(DisCallback, 0)) { Console.Write(NowTime() + "系统初始化,成功!"); 系统实时信息.AppendText(DateTime.Now.ToLongDateString().ToString() + DateTime.Now.ToLongTimeString().ToString() + " : " + "系统初始化,成功!"); File.AppendAllText(LogSavePath, NowTime() + "系统初始化,成功!", Encoding.UTF8); } else { Console.Write(NowTime() + "系统初始化,失败!"); 系统实时信息.AppendText(NowTime() + "系统初始化,失败!"); File.AppendAllText(LogSavePath, NowTime() + "系统初始化,失败!", Encoding.UTF8); } } //---------------------------------------------------------------------------------------------------- //断线回掉函数,输出断线信息,停止RealPlay、PC端录像 void DisConnectBackCall(int lLoginID, string pchDVRIP, int nDVRPort, IntPtr dwUser) { ActiveRegListStruct ActiveRegListOne; ActiveRegList.TryGetValue(lLoginID, out ActiveRegListOne); Message = new MessageStruct(); Message.msg = "设备:" + ActiveRegListOne.RasID + "(" + ActiveRegListOne.SerialNumber + ")" + ",断线!"; ShowMessage(); if (XMSDK.H264_DVR_StopLocalRecord(ActiveRegListOne.RealPlayID)) { ActiveRegListOne.RecordingTime = -1; Message = new MessageStruct(); Message.msg = "设备:" + ActiveRegListOne.RasID + "(" + ActiveRegListOne.SerialNumber + ")" + ",停止PC端录像!"; ShowMessage(); } if (XMSDK.H264_DVR_StopRealPlay(ActiveRegListOne.RealPlayID, (uint)ActiveRegListOne.Handle)) { ActiveRegListOne.RealPlayID = -1; Message = new MessageStruct(); Message.msg = "设备:" + ActiveRegListOne.RasID + "(" + ActiveRegListOne.SerialNumber + ")" + ",停止实时监视!"; ShowMessage(); } if (ActiveRegList.ContainsKey(lLoginID)) { ActiveRegList.Remove(lLoginID); } AddToTreeView(); } //---------------------------------------------------------------------------------------------------- //设备主动注册 public void StartActiveRigister() { int port = 9300; ActiveRegCallBack = new XMSDK.ActiveRigisterCallBackDelegate(ActiveRigisterCallBack); if (XMSDK.H264_DVR_StartActiveRigister(port, ActiveRegCallBack, 0)) { PrintMessage("远程设备主动注册监听,成功!"); PrintMessage("开始监听:" + port.ToString() + "端口,等待设备连接。"); } else { PrintMessage("远程设备主动注册监听开始,失败!"); } } //---------------------------------------------------------------------------------------------------- //主动监听回调函数 public void ActiveRigisterCallBack(int lLoginID, IntPtr pBuf, uint dwBufLen, uint dwUser) { H264_DVR_ACTIVEREG_INFO ActiveClientInfo; ActiveClientInfo = (H264_DVR_ACTIVEREG_INFO)Marshal.PtrToStructure(pBuf, typeof(H264_DVR_ACTIVEREG_INFO)); if (ActiveRegList.Count < 6) { ActiveRegListStruct ActiveRegListOne; ActiveRegListOne.LoginID = lLoginID; ActiveRegListOne.RasID = ActiveClientInfo.deviceSarialID; ActiveRegListOne.SerialNumber = ActiveClientInfo.deviceInfo.sSerialNumber; ActiveRegListOne.VideoOutChannel = ActiveClientInfo.deviceInfo.iVideoOutChannel; ActiveRegListOne.deviceInfo = ActiveClientInfo.deviceInfo; ActiveRegListOne.RealPlayID = -1; ActiveRegListOne.RecordingTime = -1; ActiveRegListOne.isSetKeepLifeTime = XMSDK.H264_DVR_SetKeepLifeTime(lLoginID, 1, 1 * 2); ActiveRegListOne.Handle = HandleArray[ActiveRegList.Count]; ActiveRegList.Add(lLoginID, ActiveRegListOne); NowActiveReg = ActiveRegListOne; //---------------------------------------------------------------------------------------------------- //更新设备列表TreeView AddToTreeView(); //---------------------------------------------------------------------------------------------------- //开始RealPlay和PC端录像 StartRealPlayLocalRecord(); } else { MessageBox.Show("当前连接数过多,本系统最多支持6个通道连接!"); } } class XMSDK { public delegate void DisConnectCallBackDelegate(int lLoginID, string pchDVRIP, int nDVRPort, IntPtr dwUser); //断线回调函数,回调出当前已经断开的设备 public delegate void ActiveRigisterCallBackDelegate(int lLoginID, IntPtr pBuf, uint dwBufLen, uint dwUser); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_Init(DisConnectCallBackDelegate cbDisConnect,uint dwUser); //SDK初始化 [DllImport("NetSdk.dll")] public static extern bool H264_DVR_StartActiveRigister(int nPort, ActiveRigisterCallBackDelegate cbFunc, uint dwDataUser); //远程设备主动注册监听 [DllImport("NetSdk.dll")] public static extern bool H264_DVR_StopActiveRigister(); //远程设备主动注册监听 [DllImport("NetSdk.dll")] public static extern int H264_DVR_RealPlay(int lLoginID, ref H264_DVR_CLIENTINFO lpClientInfo); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_StopRealPlay(int lLoginID, uint dwUser); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_StartLocalRecord(int lRealHandle, string szSaveFileName, int type); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_StopLocalRecord(int lRealHandle); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_SetKeepLifeTime(int lLoginID, int perKeeplifeTime, int detectDisconTime); [DllImport("NetSdk.dll")] public static extern int H264_DVR_GetLastError(); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_Cleanup(); } public struct ActiveRegListStruct { public int LoginID; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public String RasID; //RAS-ID 类似于laizhou [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public String SerialNumber;//设备序列号 MAC地址 唯一标识符 public int VideoOutChannel; //单个设备输出通道数 public bool isSetKeepLifeTime; //设置心跳时间是否成功的返回值,1 成功,0 失败 public int RealPlayID; //执行RealPlay方法的返回值,用于LoaclRecord public int RecordingTime;//显示已录像多长时间,-1为没有开始录像 public IntPtr Handle; //Handle public H264_DVR_DEVICEINFO deviceInfo; } //---------------------------------------------------------------------------------------------------- //已连接的设备列表 public static Dictionary<int, ActiveRegListStruct> ActiveRegList = new Dictionary<int, ActiveRegListStruct>();
C#如何通过IntPtr获得缓存内容?
我通过调用GDI32.DLL的GetGlyphOutline()函数,获得了一块字符位图缓存buffer,这个buffer是以字节方式存储的,由IntPtr类型的值lpBuf调用。但是我在代码中调时: BYTE btCode = lpBuf[int i +int j]; 显示IntPtr不能使用[]索引方式,向各位大神请教一下怎么在C#中通过这个IntPtr值逐一访问缓存中的各个字节?
c#调用c++dll函数时参数传递的问题?怎样正确传值?
在c++项目cpptest.dll中定义: struct A { int X; int Y; }; extern "C" __declspec(dllexport) int fun1(A *a); int fun1(A *a) { return a->X; } 在C#项目中定义: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] class A { public int X; public int Y; } [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate int dofun(ref A a1); class Program { static void Main(string[] args) { //1. 动态加载C++ Dll int hModule = NativeMethod.LoadLibrary("cpptest.dll"); if (hModule == 0) return; //2. 读取函数指针 IntPtr intPtr = NativeMethod.GetProcAddress(hModule, "fun1"); //3. 将函数指针封装成委托 dofun dofun1 = (dofun)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(dofun)); A a1 = new A(); a1.X = 1; a1.Y = 2; Console.WriteLine(dofun1(ref a1)); } } 为什么每次运行输出都不相同,且数字不是1也不是2,而是类似7825552,14052168,21507032?该如何修改呢?
C#中 使用windowsAPI writefile函数 返回一直FALSE
RT 项目需要 能够在SD卡的指定偏移位置写入数据,因此使用windowsAPI的 writefile函数 引用了kernel32.dll 转换的数据类型结果如下 [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "WriteFile", SetLastError = true, ThrowOnUnmappableChar = true)] [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] public static extern unsafe bool WriteFile ( System.IntPtr hFile, void* lpBuffer, uint nNumberOfBytesToWrite, uint* lpNumberOfBytesWritten, int lpOverlapped ); 用createfile方法 以物理形式访问SD卡访问模式 为GENERIC_READ|GENERIC_WRITE,共享模式为FILE_SHARE_WRITE. 但最后调用的时候 总是写不进去 返回值始终为false 求大侠们指点!!!!!!!!
如何解决C#向C++DLL传递 struct数组时产生的数据丢失问题?
运行环境:win8.1+vs2010 目的:将C#中的结构体数组传到C++的动态链接库中 代码: ``` //DLL中的接口,C++ struct Target { int ID; double PosX double PosY; float Aangle; long EncoderValue; }; class Backstage { EXTERN_C BACKSTAGE_API int WINAPI Allocater_AddNewTargets(Target *targets,int num); } ``` ``` //使用DLL的c#代码 [StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] public struct Target { public int ID; public double PosX; public double PosY; public float Aangle; public long EncoderValue; }; private void button1_Click(object sender, RoutedEventArgs e) { Target[] targets = new Target[4]; targets[0].Aangle = 12.1F; targets[0].EncoderValue = 0; targets[0].ID = 10; targets[0].PosX = 12.4; targets[0].PosY = 123.22; unsafe { fixed (Target* p = targets) { Backstage.Allocater_AddNewTargets(p, targets.Length); } } } ``` 问题描述:当调用函数时马上出现结构体数据被刷掉的情况。断点在进入Allocater_AddNewTargets的前一句代码,结构体中的数据还是正确的。断点在Allocater_AddNewTargets中的第一句代码,发现结构体的数据已经被刷掉了。 **注意:结构体地址被正确传送,甚至结构体内的每一个变量的地址也正确** 尝试: 1、在C#中用IntPtr开辟非托管内存块储存结构体,并用IntPtr作为参数,还是一样的情况,**结构体数据被刷掉**。 2、把C#结构体的[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)]特性去掉,**结构体数据正确,但出现内存边界对齐问题。**C++的结构体是4字符对齐,C#的结构体是8字符对齐。 3、把C#结构体的[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)]特性去掉,改为在C++中用#pragma pack(1)改变C++结构体的对齐方式,结果还是**结构体数据被刷掉**。
C# 引用C++的dll,在C# 如何获取结构体的句柄 作为传入参数,求高手帮忙。
C++ 结构体如下 typedef struct tagHIP { USHORT dhcp_enable; //DHCP使能 USHORT reserve; //保留 CHAR ip[HIP_BUF_LEN_32];// 设备IP CHAR netmask[HIP_BUF_LEN_32]; CHAR gateway[HIP_BUF_LEN_32]; CHAR mac[HIP_MAC_LEN_20]; CHAR multi_ip[HIP_BUF_LEN_32];//多播地址 CHAR dns_addr[HIP_BUF_LEN_32];//DNS服务器 CHAR dns_addr_ext[HIP_BUF_LEN_32];//备用DNS服务器 LONG lReserve; //保留 }HIP_NETWORKE, *LPHIP_NETWORK_t; 函数接口如下 int HIP_I_GetDeviceConfig(LONG lLoginID, DWORD dwCommand,LONG lChannel, LPVOID lpOutBuffer, DWORD dwOutBufferSize, LPDWORD lpBytesReturned, int waittime); 使用如下: DWORD dwReturn=0; tagHIP_NETWORKETHPARAM para_network; int i1=HIP_I_GetDeviceConfig(theApp.loginId, 3 ,0,&para_network,sizeof(tagHIP_NETWORKETHPARAM),&dwReturn,0);//获取参数 结构体及接口转成C#代码如下 public struct tagHIP { public ushort dhcp_enable; //DHCP使能 public ushort cmd_port; public ushort data_port; // 数据端口 public ushort web_port; //web 端口 public ushort broad_port; public ushort multi_port; //多播端口 public ushort rtsp_port; //RTSP端口 public ushort reserve; //保留 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)] public byte[] ip;// 设备IP [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)] public byte[] netmask; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)] public byte[] gateway; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)] public byte[] mac; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)] public byte[] multi_ip;//多播地址 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)] public byte[] dns_addr;//DNS服务器 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)] public byte[] dns_addr_ext;//备用DNS服务器 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.I1)] public byte[] bReserve; //保留 public void Init() { ip = new byte[32]; netmask = new byte[32]; gateway = new byte[32]; mac = new byte[32]; multi_ip = new byte[32]; dns_addr = new byte[32]; dns_addr_ext = new byte[32]; bReserve = new byte[4]; } } 接口 [DllImport("HIPI_Sdk.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int HIP_I_GetDeviceConfig(int lLoginID, uint dwCommand, int lChannel, IntPtr lpOutBuffer, int dwOutBufferSize, IntPtr lpBytesReturned, int waittime); C# 代码中如何使用HIP_I_GetDeviceConfig();这个函数,第四个参数如何才能把结构体转成句柄??? 求高手解决,在下感激不尽。
C#调用C++的dll,C++程序中给结构体中变量赋值this指针,对应C#中应该怎么写呢?
C++程序中有一个结构体 ``` struct Ctx { void* owner; DevInfo devinfo; }; ``` 对话框类头文件中有 ``` Ctx m_ctx;//回调上下文, 作为回调函数的参数 ``` 在对话框初始化程序中有 ``` m_ctx.owner = this; ``` 我在C#中定义结构体 ``` public struct Ctx { public IntPtr powner; public DevInfo devinfo; } ``` 定义了 public Ctx m_ctx; 那么怎么给m_ctx.powner赋值呢? 下面是部分代码,需要的话也可以把代码都发出来 C++ ``` BOOL Cdbc_demoDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 m_hDBC = DBC_Init(); if (INVALID_DBC_HANDLE == m_hDBC) { MessageBox(_T("生成DBC句柄失败!")); return TRUE; } m_ctx.owner = this; m_ctx.devinfo = m_devInfo; DBC_SetSender(m_hDBC, OnSendFunc, &m_ctx); DBC_SetOnMultiTransDoneFunc(m_hDBC, OnMultiTransDoneFunc, &m_ctx); InitList(); if (!InitDevice()) { MessageBox(_T("打开设备失败!")); return TRUE; } return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } ```
C#调用C++ dll的参数转换问题,如何转换char **类型的参数到C#
这是C++代码 DLL_API int Onvif_Discovery(char** deviceaddress, int* nDevices); 这是C#调用 [DllImport("OnvifDll.dll",EntryPoint="Onvif_Discovery", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)] public extern static int Onvif_Discovery(out IntPtr deviceAddr, ref int nDevices); 其中deviceAddr的参数我试过ref string,string,stringbulider,都报错,尝试读写受保护的内存。 初学C#的妹子一枚,希望哪位有经验的C#大神给予解答!万分感激!!!
C#调用c++ dll 封送结构体数组,无法成功
c++代码: class qf { private: char *id; char *mc; float sd; int LX; }; 函数:int EntryPoint(qf *qfw); c#代码: public class qf { private string id; private string mc; private float sd; private int LX; }; c#调用: qf[] qfw = new qf[2]; for (int i = 0; i < qfw.Length; i++) { qfw[i] = new qf(t, t, (float)0.5, 1); } IntPtr[] ptrarr = new IntPtr[1]; ptrarr[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(qf)) * 2); //分配包含两个元素的数组 IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(qf))); Marshal.Copy(ptrarr, 0, pt, 1); //拷贝指针数组 dll.EntryPoint( pt); 可以进入c++,但是传进去的pt是乱码?这是为何呢?求大神解释?
C#WinForm多线程更新treeview问题
C#新手。。。C#程序调用dll,dll中有一个回调函数用于接受数据,想根据接收到的数据增加treeview节点,怎么操作?直接在回调函数中程序会崩溃。 nt iSize = cJSON_GetArraySize(iptr11); for (int i = 0; i < iSize; i++) { IntPtr iptr12 = cJSON_GetArrayItem(iptr11, i); if (iptr12 != IntPtr.Zero) { IntPtr iptr13 = cJSON_GetObjectItem(iptr12, "deviceId");//这个“DeviceName”名称待定 if (iptr13 != IntPtr.Zero) { Json entries = (Json)Marshal.PtrToStructure(iptr13, typeof(Json)); string str = entries.valuestring; this.treeView1.Nodes.Add(str); } } }
c#调用c++的dll出现尝试读取或写入受保护的内存问题
使用c#调用c++的一个dll。c++的接口函数为: ``` extern "C" __declspec(dllexport)bool __stdcall CreateDetmObject(IDetManager **ppDetManager); ``` 参数IDetManager为一个结构体: ``` struct IDetManager { virtual void __stdcall SetListener(HWND hWnd) = 0; virtual bool __stdcall OpenDetector(const char *strIniFile) = 0; virtual bool __stdcall CloseDetector() = 0; } ``` 在c#端对接口函数和结构体重新定义如下: ``` [DllImport(DllName)] public extern static bool CreateDetmObject(ref IDetManager ppDetManager); [StructLayout(LayoutKind.Sequential)] public class IDetManager { public IntPtr SetListener; public IntPtr OpenDetector; public IntPtr CloseDetector; } ``` c#调用代码如下: ``` Tzb.CInterface.IDetManager iDetManager = new Tzb.CInterface.IDetManager(); CInterface.CreateDetmObject(ref iDetManager); Func<bool> closeDetector = (Func<bool>)Marshal.GetDelegateForFunctionPointer(iDetManager.CloseDetector, typeof(Func<bool>)); closeDetector(); ``` 但每次运行到CInterface.CreateDetmObject(ref iDetManager);时,程序崩溃,提示错误: “System.AccessViolationException”类型的未经处理的异常出现在 Tzb.exe 中。 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 不知是我的c#代码哪里出了错误,希望大家可以多多帮助。
c# 调用c++ sdk 传结构体指针
本人菜鸟一枚 SDK函数 LIBBVCU_API BVCU_Result BVCU_Initialize( const BVCU_GlobalParam* pParam); 其中 BVCU_GlobalParam为结构体 typedef struct _BVCU_GlobalParam { int iSize; void (*OnEvent)(int iEventCode, void* pParam); int iReserved[4]; }BVCU_GlobalParam; 问题我是该直接传递一个指针,还是传一个BVCU_GlobalParam类型参数 public IntPtr m_bvcuSdkHandle; BVCU_Initialize(ref Im_bvcuSdkHandle)(指针) 还是 BVCU_Initialize(ref _BVCU_GlobalParam bg) (结构体) [DllImport("libBVCU.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int BVCU_Initialize(ref IntPtr handle); [StructLayout(LayoutKind.Sequential)] public struct BVCU_GlobalParam { public int iSize; public CallbackDelegate OnEvent; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public int[] iReserved; }; 这两种都试了,接口返回还是参数不符合,请大神上码指教
c语言调用动态库中的函数,不能获取返回值,但C#可以,不知c代码该如何改进?vs2017环境下。
c语言: typedef char * (__stdcall *MYPROC)(char * s, char * rs);//函数原型,s:传入数据,rs:返回数据。 HINSTANCE hinstLib; MYPROC send; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; WCHAR msg[] = L"{\"head\":{\"jylsh\":\"330199103576000000000000001811\",\"xxlxm\":\"C009\",\"fhsj\":\"\",\"xxfhm\":\"\",\"fhxx\":\"\",\"yytcq\":\"330799\",\"zdjbh\":\"Test11111\",\"yljgdm\":\"8095\",\"czydm\":\"\",\"bbh\":\"1.0\"},\"data\":{\"ksjgs\":{\"klb\":\"12\",\"knsj\":\"A30533169330799D1560000050009A4378127B360\"}}}"; wprintf(L"%s", msg); WCHAR P[] = L""; char oututfmsg[1024] = { 0 }; WCHAR outmsg[2048] = { 0 }; char utfmsg[10240] = { 0 }; unicode_to_utf8((short *)msg, utfmsg); hinstLib = LoadLibrary(TEXT("SendRcvB.dll")); if (hinstLib != NULL) { printf("begin GetProcAddres\n"); send = (MYPROC)GetProcAddress(hinstLib, "SendRcv"); if (NULL != send) { char * rcode = send(utfmsg, oututfmsg);//调试发现oututfmsg调用前后未发生变化 fRunTimeLinkSuccess = TRUE; } wprintf(L"%s", oututfmsg); fFreeResult = FreeLibrary(hinstLib); } c#代码如下: [DllImport("SendRcvB.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.StdCall)] private extern static IntPtr SendRcv(IntPtr sSend, out IntPtr sRcv); public Main() { InitializeComponent(); } private void btn_fs_Click(object sender, EventArgs e) { try { string sRcv, sRs; string sIn = rTextIn.Text; byte[] tmpIn = gbkToUft8(sIn); IntPtr pIn = mallocIntptr(tmpIn.Length); Marshal.Copy(tmpIn, 0, pIn, tmpIn.Length); //IntPtr pIn = mallocIntptr(sIn); IntPtr pOut = IntPtr.Zero; IntPtr pRs = IntPtr.Zero; pRs = SendRcv(pIn, out pOut);//pOut指针在变化,能指向返回数据 sRcv = Marshal.PtrToStringUni(pOut); sRs = Marshal.PtrToStringAnsi(pRs); sRcv = utf8ToGbk(sRcv); rTextOut.Text = sRcv; Marshal.FreeHGlobal(pIn); } catch (Exception oe) { MessageBox.Show(oe.Message); }
C#调用C++DLL结构体指针传参问题,求大神现身指导,在线等!!!
c++方法: ``` extern "C" _declspec(dllexport) bool GetKE(string CaseId, string CaseText, string &CaseReason, SS *KeList,int &nLen_KeList); ``` c++结构体: ``` typedef struct BriefKE { string KeName; string KeValue; }SS; ``` C#结构体: ``` [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)] public struct BriefKE { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string KeName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string KeValue; } ``` C#函数: ``` [DllImport("KnowledgeExtract.dll", EntryPoint = "GetKE")] [return: MarshalAs(UnmanagedType.Bool)] public unsafe static extern bool GetKE(StringBuilder CaseId, StringBuilder CaseText, ref StringBuilder CaseReason, BriefKE[] infos, ref int nLen_KeList); ``` C#调用: ``` //结构体数组指针初始化 SS[] KeList = new SS[20]; for (int i = 0; i < KeList.Length; i++) { KeList[i] = new SS(); } IntPtr[] ptArray = new IntPtr[1]; ptArray[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SS)) * 20); IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SS))); Marshal.Copy(ptArray, 0, pt, 1); //其他几个参数初始化省略 if (!test.GetKE(caseId, caseText, ref caseReason, infos, ref len)) { Console.WriteLine("读取失败"); Console.ReadLine(); } ``` 总是报下面这个错,请大神给写一个C#调用的例子 ``` “System.AccessViolationException”类型的未经处理的异常在 未知模块。 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 ```
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
使用 Docker 部署 Spring Boot 项目
Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 S...
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
Android 9.0 init 启动流程
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、启动流程概述一、 启动流程概述Android启动流程跟Linux启动类似,大致分为如下五个阶段。1.开机上电,加载固化的ROM。2.加载BootLoader,拉起Android OS。3.加载Uboot,初始外设,引导Kernel启动等。...
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问