Vector不会存储正确的数据类型(wchar_t而不是uint16_t)

时间:2011-10-20 12:41:13

标签: c++ wchar-t

我有一些代码来自网络阅读高光谱数据(图像,所以很多整数给出像素强度)到一个矢量。我在Linux系统上成功使用了代码,但现在我需要在Windows系统上使用相同的代码。我使用的是Visual Studio 2008。

在Linux中读取数据我得到一个充满整数的向量。在Windows上我得到整数,然后是一些字符或字节数据。我不知道如何更好地描述它。

矢量由

初始化
std::vector< unsigned short int > data;
data.resize( samples * lines * bands );
std::fill( data.begin(), data.end(), 0 );

,相关代码是

for( unsigned int i=0; i < num_pixels && file; ++i ){
     char number[sizeof(DataType)];
     file.read( number , sizeof( DataType ) );
     int l = sizeof(DataType)-1;
    if (machine_endian != header.big_endian) {
        for (int j = 0; j < l; j++, l--){
            number[j] ^=number[l];
            number[l] ^= number[j];
            number[j] ^= number[l];
        }
    }
 unsigned short temp = *((unsigned short int*)number);
     data[i] = temp;
}

machine_endian部分永远不会运行。 temp只是测试我是否可以将数字转换为int。它工作正常。但是,当我将temp放入向量时,插入的信息不仅仅是int,而且它被列为wchar_t。见下图。我想这与类型大小有关,但我对此无能为力。是我的还是Visual Studios的错?有什么想法吗?

3 个答案:

答案 0 :(得分:1)

实际上,它运作正常。 Microsoft只是想方便检查wchar_t值(short int并在Windows上表示utf16编码字符),因此他们的调试器将short int显示为wchar_t s。这只是一个解释问题。

如果您使用char s作为数据,几乎在任何架构上都会遇到相同的现象。

答案 1 :(得分:0)

typedef struct {
    unsigned short x;
    unsigned short y;
    unsigned short z;
} vec3_t;

并使用vec3_t而不是std :: vector。

在Windows中,wchar_t与unsigned short相同,而在Unix中它的长度为4个字节,因此您应该创建自己的矢量类型以使代码可移植。

答案 2 :(得分:0)

一切正常,只是wchar_t是平台上unsigned short的同义词,因此调试器不知道在那里显示什么名称。此外,没有插入“更多信息”。 MSVC调试器再次将该数字解释为宽字符。