从unsigned char *转换为const wchar_t *

时间:2013-05-17 12:24:32

标签: c++ visual-c++ casting cross-platform type-conversion

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

CODE

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慣敬慆瑣牯㨢㠠嵽筛猢慣敬慆瑣牯㨢㤠嵽筛猢慣敬慆瑣牯㨢ㄠ細ﵝ﷽꯽ꮫꮫꮫﺫﻮ"

4 个答案:

答案 0 :(得分:3)

wchar_t* levelData = new wchar_t();
mbstowcs(&levelData[0], &temp1[0], size*10);

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

此外,10来自哪里?

答案 1 :(得分:1)

如果您要动态分配缓冲区大小(使用新的),则无需对缓冲区大小进行硬编码。

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

答案 2 :(得分:0)

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

wchar_t levelData[200];
mbstowcs(&levelData[0], &temp1[0], size);

答案 3 :(得分:0)

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数组来说应该足够大,而在[]中指定数组的元素数,而不是字节数(也就是{{1} }} S)。 - 在这种情况下,它是宽字符的数量。哪个不能多,请阅读char s。

您应该注意的另一件事是,char可能会读取二进制日期。因此,fileUtils->getFileData中的文字后面跟不是0.因此,稍后调用它的字符串函数(如temp)会将你的脚踢掉。

彼此。如果你不熟悉建筑

wcstok

请记住,您在C / C ++中的程序不知道 function_on_arrays( target, source, size ) target的大小。但可能,你不希望函数做一些超越它们的事情。所以这就是source主要是什么。 - 您可以通过手动方式说明要执行操作的元素数量,以避免超出数组的数据。

修改 早期的解决方案是错误的,因为错误地将size的最后一个参数视为源中的字符数。