我试图了解如何从以下结构中的不安全字节指针获取字符串。SDL_TEXTINPUTEVENT_TEXTSIZE为32。
[StructLayout(LayoutKind.Sequential)]
public unsafe struct SDL_TextInputEvent
{
public SDL_EventType type;
public UInt32 timestamp;
public UInt32 windowID;
public fixed byte text[SDL_TEXTINPUTEVENT_TEXT_SIZE];
}
我试过了:
byte[] rawBytes = new byte[SDL_TEXTINPUTEVENT_TEXT_SIZE];
unsafe
{
Marshal.Copy((IntPtr)rawEvent.text.text, rawBytes, 0, SDL_TEXTINPUTEVENT_TEXT_SIZE);
}
string text = System.Text.Encoding.UTF8.GetString(rawBytes);
哪种方法有效,但是给了我一个字符串,除了实际输入的字符以外,还有很多额外的字节。我是否应该解析字节数组并搜索以0结尾的字符以避免过多的字符?
我完全误会了什么吗?
供参考,已编组到.NET运行时的原始C结构为:
typedef struct SDL_TextInputEvent
{
Uint32 type;
Uint32 timestamp;
Uint32 windowID;
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE];
} SDL_TextInputEvent;
您确实需要找到空终止符。并且Marshal.Copy
不会那样做。Marshal.PtrToStringAnsi
如果您的文本是ANSI编码的,则可以使用。但是UTF-8没有这样的功能。因此,您需要遍历数组以寻找零字节。遇到这种情况时,您便知道缓冲区的实际长度,可以修改现有代码以使用该长度而不是最大可能的长度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句