【问题标题】:Converting UInt16* to char将 UInt16* 转换为 char
【发布时间】:2016-07-04 20:24:20
【问题描述】:

我想参考the test application code for 7zip

在以下行(第 383 行):

SzArEx_GetFileNameUtf16(&db, i, temp); //Line 383, gets directory and filename

uint16* 值temp 获取文件路径的引用表达式(我假设它是一个字符串)。

我有一个 const char,我们将其命名为 filePathToCheck,这基本上是一个文件路径名称。我想要的是一种将 filePathToCheck 值与 temp 值进行比较的方法,以便我可以“选择”我要解密的文件

我最初的实现是获取 temp 的多字节值,但这给出了一个空字符串,可在以下方法中找到:

WideCharToMultiByte(CP_UTF8,NULL,temp,sizeof(temp),testa /* char * */, 0, NULL, NULL);

在运行测试应用程序时(参数已被处理),在 WideCharToMultiByte 函数之后,testa 仍然是一个空字符串。我是不是完全走错了路,我应该以另一种方式处理?

Sample code because the minimum code is still too large

【问题讨论】:

  • 作为参考,它是为了被制作成一个dll,所以我不能使用原始应用程序。
  • WideCharToMultiByte 工作正常。你一定做错了什么。显示minimal reproducible example
  • 我认为第 6 个参数是 0 使 API 返回所需大小的 testa 缓冲区。发生这种情况时,testa 缓冲区就没有用了。我的建议是再次使用 API,但这次将前一个调用的返回值作为第 6 个参数 cbMultiByte 传递。我的假设是基于 MSDN If this parameter is set to 0, the function returns the required buffer size for lpMultiByteStr and makes no use of the output parameter itself. 的这一行
  • 这样做会产生访问冲突错误,这是有道理的,因为写入的字节数是 4。将参数 6 更改为 4 也会产生相同的错误。

标签: c++


【解决方案1】:

sizeof(temp) 返回 uint * 的大小,即 4 或 8。您想要的是 temp 的长度(以字符为单位),或者如果 temp 以 null 结尾,则可以简单地传递 -1。

testa 最好是一个足够大的字节数组(不是字符指针!)。下一个参数不应该是 0,而是sizeof(testa)

【讨论】:

  • 我正在使用预定义的 char 数组来存储它(例如:char testchar[128]),当与可变长度的明确 char 指针进行比较时,我是否需要通过复制来“调整”变量的大小char 数组到 char 指针还是没有必要?
  • 如果您确定输入的长度存在上限,则可以使用固定大小的目标缓冲区。如果没有,它会变得更复杂一点:您需要一次调用 WideCharToMultiByte(缓冲区长度设置为零)来确定所需的内存,然后动态分配该内存(您可以使用 vector 或 pre-分配的字符串,它不必是 malloc 或 new[]),然后再次调用 WideCharToMultiByte 以实际获取翻译后的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 2021-06-29
  • 2019-10-13
  • 1970-01-01
  • 2020-06-27
  • 2018-10-29
  • 1970-01-01
相关资源
最近更新 更多