从无符号char*到常量wchar_t*的转换

conversion from unsigned char* to const wchar_t*

本文关键字:转换 wchar 常量 无符号 char      更新时间:2023-10-16

我正在使用以下代码将字符串从unsigned char*转换为const wchar_t*。我得到的错误是,只有几个单词被正确转换,而其余的都是乱码值。

代码

unsigned char* temp = fileUtils->getFileData("levels.json", "r", &size);
const char* temp1 = reinterpret_cast<const char*>(temp);
size_t len = mbstowcs(nullptr, &temp1[0], 0);
if (len == -1) {
} else {
    wchar_t* levelData = new wchar_t();
    mbstowcs(&levelData[0], &temp1[0], size*10);
}

输出

temp1 = "[{"scaleFactor": 1}][{"scaleFactor": 2}][{"scaleFactor": 3}][{"scaleFactor": 4}][{"scaleFactor": 5}][{"scaleFactor": 6}][{"scaleFactor": 7}][{"scaleFactor": 8}][{"scaleFactor": 9}][{"scaleFactor": 10}]"
levelData = "[{"scaleFactor": 1}][{"scaleFactor": 2}][{"scaleFactor": 3}][{"scaleFactor": 4}][{"scaleFactor": 5}][{"scaleFactor": 6}][{"scaleFactor": 7}][{"s慣敬慆瑣牯㨢㠠嵽筛猢慣敬慆瑣牯㨢㤠嵽筛猢慣敬慆瑣牯㨢ㄠ細ﵝ﷽꯽ꮫꮫꮫﺫﻮ"
wchar_t* levelData = new wchar_t();
mbstowcs(&levelData[0], &temp1[0], size*10);

这只为一个字符分配了足够的内存。这还不足以存储字符串,所以事情当然不会正常工作。

另外,10是从哪里来的?

如果要动态分配缓冲区(使用new(,则不需要硬编码缓冲区大小。

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

感谢@BenVoigt,发现了错误。将代码更改为此-

wchar_t levelData[200];
mbstowcs(&levelData[0], &temp1[0], size);
unsigned char* temp = fileUtils->getFileData("levels.json", "r", &size);
const char* temp1 = reinterpret_cast<const char*>(temp);
wchar_t* levelData = new wchar_t[size];
int last_char_size = 0;
mbtowc(NULL, 0, 0);
for (wchar_t* position = levelData; size > 0; position++)
{
    last_char_size = mbtowc(position, temp1, size);
    if (last_char_size <= 0) break;
    else {
        temp1 += last_char_size;
        size -= last_char_size;
    }
}
if (last_char_size == -1)
{
    std::cout  << "Invalid encoding" << std::endl;
}
delete[] temp; // * probably

标记线(*(取决于fileUtils->getFileData是否为temp分配内存块,而fileUtils的对象是否自己管理它。——这是最有可能的。但是,您应该查看文档。

size对于levelData数组来说应该足够大,而在[]中,您指定的是数组的元素数,而不是字节数(也称为chars(在这种情况下,它是宽字符的数量。不能再多了,然后读取chars.

您应该注意的另一件事是,fileUtils->getFileData可能读取二进制日期。因此temp中的文本后面没有0。因此,稍后调用的字符串函数(如wcstok(会让你大吃一惊

还有彼此。如果你不熟悉的结构

    function_on_arrays( target,  source,  size )

请记住,您在C/C++中的程序不知道targetsource的大小。但很可能,你不想让函数做一些超出它们的事情。所以这就是size的主要功能。-你的手动方式,关于你想执行多少元素的操作,不要超出数组的数据。

编辑:早期的解决方案是错误的,因为错误地将mbstowcs的最后一个参数视为源中的字符数。