【问题标题】:How to efficiently read a null terminated, non unicode string from unmanaged memory如何有效地从非托管内存中读取空终止的非 unicode 字符串
【发布时间】:2020-03-22 15:56:53
【问题描述】:

我需要从内存中读取几千个以 null 结尾的 C 字符串。

我目前的解决方案如下

byte* stringPointer; // Obviously has an actual value in my codebase

var stringLength = 0;

while (*(stringPointer + stringLength) != 0x00) 
{
    stringLength += 1;
}

var unmanagedString = Encoding.UTF8.GetString(stringPointer, stringLength);

这很好,但我只是想知道是否有更有效的方法来做到这一点,考虑到每次调用这个函数时我都会读取数千个这样的字符串。

有什么想法吗?

【问题讨论】:

  • [MarshalAs(UnmanagedType.LPStr)] string stringPointer?
  • 这能回答你的问题吗? Reading a null-terminated string
  • “有什么想法吗?”——这就是“太宽泛”的定义。你现在的代码有什么问题?有无数种不同的方法可以将空终止字符串从非托管内存封送到托管对象。最好的方法将利用 .NET 互操作 API。 “每次调用这个函数时,我都会读取数千个这样的字符串。” -- 你多久调用一次这个函数?作为一次性的事情,1000 根琴弦是轻而易举的事。您必须经常这样做才能成为问题;那时你应该问你是否经常需要那么多字符串。

标签: c# performance unmanaged null-terminated


【解决方案1】:

在 C# 中,Marshal.PtrToStringUTF8 采用指向 C 样式 UTF-8 字符串的指针并返回托管的 string

var mystring = Marshal.PtrToStringUTF8(stringPointer);

这可能是最有效的方法。

注意底层操作仍然是O(N),因为它涉及到复制,加上C#string需要知道长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多