问题标签 [unsafe]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2808 浏览

c# - c#:一般将非托管数组转换为托管列表

我正在处理一组通过动态分配的数组返回数据的本机函数。这些函数将引用指针作为输入,然后将其指向结果数组。

例如:

调用后,'result' 指向一个以 null 结尾的 result* 数组。

我想从这个非托管数组创建一个托管列表。我可以执行以下操作:

这是可行的,对于我必须处理的每种类型的结构(〜35)重新实现将是乏味和丑陋的。我想要一个对数组中结构类型通用的解决方案。为此,我尝试了:

但这不会编译,因为您不能“获取托管类型的地址、大小或声明指向托管类型 ('T') 的指针”。

我也尝试在不使用不安全代码的情况下执行此操作,但遇到了 Marshal.Copy() 需要知道非托管数组大小的问题。我只能使用不安全的代码来确定这一点,因此在这种情况下使用 Marshal.Copy() 似乎没有任何好处。

我错过了什么?有人可以建议一个通用的方法来解决这个问题吗?

0 投票
5 回答
15595 浏览

c# - C#:将泛型指针转换为数组

我想将 a 转换byte*为 a byte[],但我也希望有一个可重用的函数来执行此操作:

不幸的是,我得到一个编译器错误,因为 T 可能是“.NET 托管类型”,我们不能有指向那些.NET 的指针。更令人沮丧的是,没有可以将 T 限制为“非托管类型”的泛型类型约束。是否有内置的 .NET 函数来执行此操作?有任何想法吗?

0 投票
2 回答
925 浏览

c# - Silverlight 中的 BigEndianBitConverter?

我正在尝试在 Silverlight 中使用 MiscUtil.Conversion 实用程序。 http://www.yoda.arachsys.com/csharp/miscutil/

当我尝试编译它时,我收到一条错误消息,提示 Silverlight 的 BitConverter 类没有这两种方法:

DoubleToInt64Bits Int64BitsToDouble

好吧,我打开 Reflector 并在 mscorlib 中找到了它们:

但问题在于 Silverlight 不允许不安全的代码。在项目属性菜单中,“允许不安全代码”旁边有一个空复选框,但您无法更改该值。

如何在 Silverlight 中执行此操作?

0 投票
4 回答
257 浏览

c - 这个功能可以更安全吗?寻找提示和您的想法!

这是一个有点奇怪的问题。

我写了一个 C 函数。它的'喜欢' strchr / strrchr。它应该在 c 字符串中查找一个字符,但要向后查找,并返回一个指向它的指针。由于 c 字符串不是“null 启动”,它还需要第三个参数“count”,表示它应该向后看的字符数。

我已经对其进行了一些测试,但是您是否发现其中有任何缺陷?安全问题之类的?有什么增强吗?可以改进吗?更重要的是:这是一个坏主意吗?

一些用法。

编辑:新界面,一些变化。

0 投票
2 回答
1946 浏览

c# - C#:通过反射检索和使用 IntPtr*

我目前正在处理一些代码,这些代码反映了从调用返回到本机 dll 的结构。一些结构包含指向以空值结尾的指针数组的 IntPtr* 字段。这些字段需要特殊处理。当反映结构时,我可以识别这些字段,因为它们是由自定义属性标记的。

以下说明了我正在尝试做的事情:

问题是

返回一个对象,我显然不能直接将其传递给 ProcessIntPtr()。我无法更改 ProcessIntPtr() 的签名以接受对象,因为那样我将无法执行所需的指针操作。显然,我也不能从对象转换为 IntPtr*。

有哪些技术可以处理这个问题?

0 投票
7 回答
6551 浏览

c# - C# 中的 ref 和 out 是否与 C++ 中的指针相同?

我刚刚在 C# 中做了一个交换例程,如下所示:

它的作用与此 C++ 代码的作用相同:

那么refout关键字是否类似于 C# 的指针而不使用unsafe代码?

0 投票
2 回答
3761 浏览

c# - 如何在 C# 中将固定字节/字符 [100] 转换为托管字符 []?

在 C# 中将固定字节或 char[100] 转换为托管 char[] 的最佳方法是什么?我最终不得不使用指针算法,我想知道是否有更简单的方法——比如 memcpy 或其他方法?

0 投票
4 回答
12466 浏览

c# - .NET 中更快(不安全)的 BinaryReader

我遇到了一种情况,我有一个非常大的文件,我需要从中读取二进制数据。

因此,我意识到 .NET 中的默认 BinaryReader 实现非常慢。在使用.NET Reflector查看它时,我遇到了这个问题:

想想自 32 位 CPU 发明以来计算机是如何设计为使用 32 位值的,这让我觉得效率极低。

所以我用这样的代码创建了自己的(不安全的)FastBinaryReader 类:

这要快得多 - 我设法将读取 500 MB 文件的时间缩短了 5-7 秒,但总体上仍然很慢(最初是 29 秒,现在使用我的 22 秒FastBinaryReader)。

我仍然有点困惑,为什么读取这么小的文件仍然需要这么长时间。如果我将文件从一个磁盘复制到另一个磁盘只需几秒钟,因此磁盘吞吐量不是问题。

我进一步内联了 ReadInt32 等调用,最后得到了以下代码:


关于如何使这更快的任何进一步的想法?我在想也许我可以使用编组将整个文件直接映射到一些自定义结构之上的内存中,因为数据是线性的、固定大小的和连续的。

已解决:我得出的结论是 FileStream 的缓冲/BufferedStream 存在缺陷。请在下面查看接受的答案和我自己的答案(带有解决方案)。

0 投票
2 回答
785 浏览

c# - .NET Micro Framework 不安全代码

.NET Micro Framework 是否支持不安全代码?换句话说,我可以在 .NET Micro Framework 的代码中使用指针吗?

0 投票
5 回答
5081 浏览

c# - 通用的类似 BitConverter 的方法?

我最近遇到了一种情况,我需要创建一个通用方法来从字节数组中读取数据类型。

我创建了以下类:

现在,抛开取消分配问题不谈,此代码不会与此消息一起编译:

这似乎很奇怪,因为您应该能够根据对where T : struct方法的约束来执行上述操作。

如果这段代码非常不正确,是否有任何简单的方法可以获取一系列字节并将它们转换为 ' T' 类型?

谢谢!