jjzjj

c# - 将 System.Decimal 转换为 System.Guid

我有一个很大的字典,其中的键是十进制,但是System.Decimal的GetHashCode()非常糟糕。为了证明我的猜测,我运行了一个包含100.000个相邻小数的for循环并检查了分布。100.000个不同的十进制数字仅使用2(两个!!!)不同的哈希码。十进制表示为16个字节。就像Guid一样!但是Guid的GetHashCode()分布非常好。如何尽可能便宜地将小数转换为C#中的Guid?不安全的代码是可以的!编辑:请求测试,所以这里是代码:decimald=96000000000000000000m;Dictionaryhashcount=newDictionary();in

C# 将 span 与 SocketAsyncEventArgs 结合使用

我想使用新的Span将非托管数据直接发送到使用SocketAsyncEventArgs的套接字但似乎SocketAsyncEventArgs只能接受Memory不能用byte*初始化或IntPt请问有没有一种方法可以将span与SocketAsyncEventArgs一起使用??感谢您的帮助。 最佳答案 正如评论中已经提到的,Span在这里是错误的工具——你有没有考虑过使用Memory反而?正如您所说,SetBuffermethod确实接受它作为参数-你有什么理由不能使用它吗?另见thisarticle有关堆栈与堆分配如何应用于Sp

c# - 如何使用 C# 获取 char**?

这个问题在这里已经有了答案:MarshalanarrayofstringsfromC#toCcodeusingp/invoke(2个答案)C#callC++DLLpassingpointer-to-pointerargument(3个答案)关闭6年前。我需要以以下形式将参数传递给不安全的DllImported函数:[DllImport("third_party.dll")]privatestaticexternunsafeintstart(intargc,char**argv);我假设它是一个字符串数组。但是,当我尝试执行以下操作时,出现“无法从字符串[]转换为char**”错误。我该

c# - 使 TypedReference 在方法 block 之外保持事件状态而不返回它

我想假设这个问题的目的是检查是否至少有一种方法,即使是通过最不安全的hack,来保持对非blittable值类型的引用。我知道这种设计类型堪比犯罪;除了学习之外,我不会在任何实际情况下使用它。所以现在请接受阅读异端的不安全代码。我们知道可以通过这种方式存储和增加对blittable类型的引用:unsafeclassFoo{void*_ptr;publicvoidFix(refintvalue){fixed(void*ptr=&value)_ptr=ptr;}publicvoidIncrement(){varpointer=(int*)_ptr;(*pointer)++;}}在安全性方面

C#使用反射获取不安全结构中固定字段的类型

我正在尝试使用一些固定字段获取不安全结构的字段类型。固定字段FieldType不返回实际类型。[StructLayout(LayoutKind.Sequential,Pack=1)]publicunsafestructMyStruct{publicUInt32Field1;publicfixedsbyteField2[10];publicUInt64Field3;}voidTest(){vartheStruct=newMyStruct();stringoutput="";foreach(FieldInfofiintheStruct.GetType().GetFields(Binding

c# - 此处是否需要 GC.KeepAlive,或者我可以依靠局部变量和参数来保持对象的事件状态吗?

我有很多方法采用WPF的WriteableBitmap并使用不安全的代码直接从其BackBuffer中读取。每当我做这样的事情时,我是否应该使用GC.KeepAlive并不完全清楚:intMyMethod(WriteableBitmapbmp){returnDoUnsafeWork(bmp.BackBuffer);}一方面,在MyMethod的堆栈上仍然有对bmp的引用。另一方面,它似乎依赖于实现细节-这可能会编译为尾调用,例如,在输入DoUnsafeWork时不保留对bmp的引用。类似地,想象以下假设代码:intMyMethod(){WriteableBitmapbmp1=getAB

c# - 为什么这个不安全的代码会抛出 NullReferenceException?

我正在使用不安全的代码解决CodeGolf,上的问题我发现了一些我无法解释的东西。这段代码:unsafe{inti=*(int*)0;}因访问冲突(Segfault)而崩溃,但此代码:unsafe{*(int*)0=0;}抛出NullReferenceException。在我看来,第一个正在执行读取,第二个正在执行写入。一个异常告诉我,CLR中的某个地方正在拦截写入并在操作系统终止进程之前将其停止。为什么这会发生在写上,而不是在读上?如果我使指针值足够大,它会在写入时出现段错误。这是否意味着CLR知道有一block内存是保留的,甚至不会尝试写入?那么,为什么它允许我尝试读取该block

c# - 指针偏移导致溢出

以下结果对我来说没有任何意义。看起来在执行加法或减法之前将负偏移量转换为无符号。double[]x=newdouble[1000];inti=1;//fortheoverflowitmakesnodifferenceifitislong,intorshortintj=-1;unsafe{fixed(double*px=x){double*opx=px+500;//=0x33E64B8//unchecked//{double*opx1=opx+i;//=0x33E64C0double*opx2=opx-i;//=0x33E64B0double*opx3=opx+j;//=0x33E64B

c# - 通过代码从图像中裁剪空边框的简单算法?

目前我正在C#/.NET中寻找一种相当快速且相当准确的算法来在代码中执行这些步骤:将图像加载到内存中。从位置(0,0)的颜色开始,找到未被占用的空间。剪掉这个不必要的空间。我已经说明了我想要实现的目标:我能想到的是获取(0,0)处像素的颜色,然后执行一些unsafe逐行/逐列遍历所有像素,直到我用另一种颜色遇到一个像素,然后切掉边框。我只是担心这真的很慢。所以我的问题是:您是否知道任何快速算法(最好没有任何第3方库)从内存图像/位图中删除“空”边框?旁注:算法应该“合理准确”,而不是100%准确。一些容差,例如裁剪过多或过少的一行都可以。补充1:我刚刚以最简单的方式实现了我的蛮力算法。

c# - 无法获取托管类型的地址、获取其大小或声明指向托管类型的指针

我已经做了相当多的研究,但现在仍然无法理解为什么我仍然会收到此错误。我有一个具有以下属性的结构:structAccount{//privateattributesprivatedoublemBalance;privateintmAccountNumber;privatestringmName;privatestringmDateCreated;}并且正在尝试执行以下操作:classBankManager{//privateattributesprivateunsafeAccount*mAccounts;privateunsafebool*mAccountsAvailable;priva