1

我有一些来自网络的代码,将高光谱数据(图像,所以很多整数给出像素强度)读入向量。我在 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 的错?有任何想法吗?

4

3 回答 3

1

实际上,它工作正常。微软只是想方便检查wchar_t值(short int在 Windows 上是 s 并表示 utf16 编码字符),所以他们的调试器将 s 显示short intwchar_ts。这只是解释的问题。

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

于 2011-10-20T12:51:02.620 回答
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 个字节长,因此您应该创建自己的向量类型以使您的代码具有可移植性。

于 2011-10-20T12:45:07.330 回答
0

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

于 2011-10-20T12:47:39.997 回答