gpt4 book ai didi

c# - C++ 在 Visual Studio 2010 中从二进制文件读取 void* 数据作为 utf8

转载 作者:行者123 更新时间:2023-11-30 04:31:42 25 4
gpt4 key购买 nike

说实话,我的 C++ 不是很流利。

我在内存中有一些类型为 void* 的二进制数据(我认为这意味着指向一些无法表示的东西/什么都没有的指针)。数据首先由 fread 从文件中取出。

int readfile FILE *file, void **data_return) {
//some code...

fread((void *)data, length, 1, file);

//some code...
}

读取二进制数据背后有一个复杂的算法,但我认为我不需要为此任务理解它。

char *t = ((char *)loc->mo_data) + string_offset;
return t;

此代码将 void* 类型 (loc->mo_data) 读取为字符串。我想对我来说还是可以理解的。

问题在于此数据包含俄语、西类牙语、捷克语和所有可用 UTF8 表示的国际字符。

我什至不确定,“char”代表什么编码,可能是 win1250,因为返回的字符串很糟糕。该函数返回 Организация 而不是 Организация。第一个字符串是 UTF8,但以 ASCII 表示。

更大的图景:我正在玩这个已经被别人写过的 C++ 库——这个库只公开了两个函数,打开文件(返回指针)和通过字符串键从这个文件中获取字符串(返回字符串) .该库正在 C# 项目中使用。

起初,我认为在 C# 应用程序和 DLL 库之间传递 UTF8 字符串可能有问题

    [DllImport("MoReader.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr OpenFile(string path);

[DllImport("MoReader.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern string FindString(IntPtr filePointer, string key);

C++代码:

    extern "C" __declspec(dllexport) BinaryFileType* OpenFile(char *filePath);
extern "C" __declspec(dllexport) char *FindString(BinaryFileType *locText, char *key);

FindString 返回字符串,但编码错误。而且我不知道,如何读取 C# 字符串中表示的 ASCII,这些字符串是 Unicode 作为 UTF8...我尝试了一些转换方法但无济于事。

虽然我认为问题出在 C++ 代码中,但我希望 char 类型采用 UTF8 编码,我注意到有一种叫做代码页的东西并且有一些转换函数和 utf8 流阅读器,但由于我的 C++ 知识薄弱,我真的不知道解决方案。

===更新===

我在 Encoding 类中找到了一个属性...当我像这样读取输出字符串时:

Encoding.UTF8.GetString(Encoding.Default.GetBytes(e))

...结果是对的。我只是通过某种“默认”编码从字符串中获取字节,然后使用 UTF8 再次读取字节。我计算机上的默认编码是 ISO-8859-2,但依赖此属性将是非常愚蠢的。

所以...问题仍然存在。我仍然需要知道如何使用特定编码读取 void* 类型。但至少,我现在知道字符串是以 Windows 使用的默认编码返回的。

** === 答案 === **

谢谢大家的回答。

正如 James 所指出的,char * 只是数字。所以我通过只获取数字而不是试图将它们解释为字符串来避免所有编码问题。还有另一个问题...如何从 C++ 库中的 char* 中获取 C# 中的字节数组?有一个 Marshal.Copy 方法,但我需要知道字符串的大小。C++ 中的每个 char* 都必须以空字符“\0”结尾。所以最后,我只是一个字节一个字节地读取一个字节,直到找到这个空字符。代码看起来像这样。

IntPtr charPointer = ExternDll.FindString(fileIntPtr, "someString");
List<byte> bytes = new List<byte>();
for (int i=0; ;i++)
{
byte b = Marshal.ReadByte(charPointer, i);
if (b == '\0')
break;

bytes.Add(b);
}

string theResultStringInTheUTF8 = Encoding.UTF8.ToString(bytes.ToArray());

最佳答案

C++ 与字符编码无关。就此而言,如果你是通过某种骇人听闻的类型转换来获取角色,任何语言会;语言无法知道是什么编码是。

在 C++ 中,char 实际上只是一个小整数;这只是约定俗成它包含一些字符编码。但是哪种编码取决于你。如果您的输入确实是 UTF-8,则字符指向char* 将包含 UTF-8;如果是别的东西,那么它们将包含别的东西。

当您将字符输出到屏幕时,C++ 只是将它们传递(在至少默认)。由终端窗口决定如何解释它们;即将序列分解为代码点,然后映射每个代码指向图形图像。在 Unix (xterm) 下,这是由显示字体;在 Windows 下,至少正式地通过代码页(但是你当然可以安装错误编码的字体,这会把它搞砸)。 C++与此无关。 UTF-8 的代码页是 65001;如果你将终端设置为使用此代码页(命令上的 chcp 5001行),然后输出 UTF-8,它应该可以工作。

关于c# - C++ 在 Visual Studio 2010 中从二进制文件读取 void* 数据作为 utf8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8093827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com