【问题标题】:unsigned char array to wide char array/string无符号字符数组到宽字符数组/字符串
【发布时间】:2016-11-29 14:38:02
【问题描述】:

我如何/应该如何从unsigned char 数组转换为widechar 数组wchar_tstd::wstring?以及如何将其转换回unsigned char 数组?

或者 OpenSSL 是否可以从 SHA256_Update 生成宽字符哈希?

【问题讨论】:

  • 你最后的陈述几乎显示了你实际上想要做什么。显然你正在尝试散列一些东西。您正在尝试散列宽字符数据吗?您是否尝试将从哈希 API 返回的八位字节转换为宽十六进制字符(0x010AA02BB 等...)?在 either 的情况下,我希望您至少了解哈希摘要的结果是不可读的 asci(或 unicode )hex-char 数据,直到 you 做到这一点通过一些转换。它只是一个字节序列。
  • @WhozCraig 是的,我正在尝试对 std::wstring 进行哈希处理,然后我想将其发布到我的服务器(因此转换回 std::wstring 进行发布。哈希是我与之通信的身份验证令牌服务器。
  • 所以您正在散列 std::wstring(假设您散列终止 wchar),然后将生成的散列转换为 char 0 的 std::wstring。 .9,a..f(十六进制字符)发布,然后接收者将其转换回八位字节以验证哈希?这是否描述了您的工作流程?如果是这样,其中一个(第一个)可能是可以避免的,具体取决于如何生成服务器保留用于比较的哈希值,例如,如果它是使用宽数据完成的。而且我假设您已经有一个例程将原始八位字节转换为十六进制字符的std::wstring
  • 您是否考虑过使用 MultiByteToWideChar 和 WideCharToMultiByte 函数? (它是 Win API,但也许,你正在为 Windows 平台编写)
  • @WhozCraig 是的,这正是我的工作流程。服务器脚本是 PHP,因此它将与 ascii 一起使用

标签: c++ openssl widechar


【解决方案1】:

尝试以下方法:

#include <cstdlib>
using namespace std;

unsigned char* temp; // pointer to initial data
// memory allocation and filling
// calculation of string length

wchar_t* wData = new wchar_t[len+1];
mbstowcs(&wData[0], &temp1[0], len);

Сoncerning 逆向转换查看示例 here 或再次使用 mbstowcs,但要更改两个第一个参数的位置。

WideCharToMultiByte function 也可用于 Windows 开发,还应考虑设置区域设置(参见一些示例)。

更新:

要计算unsigned char* temp指向的字符串的长度,可以使用以下方法:

const char* ccp = reinterpret_cast<const char*>(temp);
size_t len = mbstowcs(nullptr, &ccp[0], 0);

【讨论】:

    【解决方案2】:
    std::setlocale(LC_ALL, "en_US.utf8");
    const char* mbstr = "hello";
    std::mbstate_t state = std::mbstate_t();
    // calc length
    int len = 1 + std::mbsrtowcs(nullptr, &mbstr, 0, &state);
    std::vector<wchar_t> wstr(len);
    std::mbsrtowcs(&wstr[0], &mbstr, wstr.size(), &state);
    

    【讨论】:

    • "由于可能的数据争用,在没有与空指针的 std::mbstate_t* 参数同步的情况下,不应从多个线程调用以下函数:std::mbrlen、std::mbrtowc、std ::mbsrtowcs、std::mbtowc、std::wcrtomb、std::wcsrtombs、std::wctomb。” ...请记录您发布的内容。
    【解决方案3】:

    我如何/应该如何将 unsigned char 数组转换为 Widechar 数组 wchar_t 或 std::wstring?以及如何将其转换回无符号字符数组?

    它们是完全不同的,所以在大多数情况下你不应该这样做。如果您使用真实代码提供特定问题,我们可能会告诉您更多信息。


    或者 OpenSSL 是否可以从 SHA256_Update 生成宽字符哈希?

    不,OpenSSL 不能这样做。它产生的散列是由字节组成的二进制字符串,而不是字符。您负责演示细节,例如窄/宽字符集或 base64 编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2015-04-16
      • 2021-12-02
      • 2014-10-24
      • 1970-01-01
      • 2011-12-09
      • 2014-09-06
      相关资源
      最近更新 更多