2011-10-20 3 views
1

하이퍼 스펙트 럴 데이터 (이미지, 픽셀 강도를주는 많은 정수)를 그물로 읽는 일부 코드가 벡터에 있습니다. 리눅스 시스템에서 성공한 코드를 사용했지만 지금은 Windows 시스템에서도 똑같은 코드가 필요합니다. Visual Studio 2008을 사용합니다.Vector가 올바른 데이터 유형 (uint16_t 대신 wchar_t)을 저장하지 않습니다.

Linux에서 데이터 읽기 나는 정수로 가득 찬 벡터를 얻습니다. 창에서 정수 및 다음 문자 또는 바이트 데이터를 가져옵니다. 나는 그것을 더 잘 묘사 할만큼 충분한 것을 모른다.

벡터는

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

에 의해 초기화하고 관련 코드는 machine_endian 부분은 실행되지 않습니다

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; 
} 

입니다. temp는 숫자를 int로 변환 할 수 있는지 테스트하는 것입니다. 그것은 잘 작동합니다. 그러나 temp를 벡터에 넣으면 int보다 더 많은 정보가 삽입되고 wchar_t로 나열됩니다. 아래 이미지를 참조하십시오. 나는 그것이 타입 크기와 관련이 있다고 생각하지만, 나는 왜 그런지 모릅니다. 그것은 내 것이거나 Visual Studios 결함입니까? 어떤 아이디어?

+2

'wchar_t'는'unsigned short'로 정의되어 있습니다. (직접적으로 정의되지 않은 경우에는 2 바이트이고 같은 방식으로 동작합니다) 그래서 단지 typename 디스플레이 문제 일뿐입니다. 번호가 정확합니까 (유형에 관계없이)? –

+0

답장을 보내 주셔서 감사합니다! Ok, 그것은 조금 지워진다. 유감스럽게도 지금 당장은 전화 번호를 확인할 수는 없지만 그 번호가 정확하지 않다고 믿을만한 이유가 없습니다 (합리적인 가치). 매우 중요하다면 값을 얻으려고 할 수는 있지만 일은별로 없습니다. 하지만 임시 변수에 어떻게 저장하고 벡터에서 동일한 데이터 유형으로 초기화 할 때 여분의 데이터를 얻을 수 있습니까? – SveinT

+0

죄송합니다. 영어가 제 첫 번째 언어가 아니기 때문에 "임시 변수에 어떻게 저장하면됩니다. 그런 다음 동일한 데이터 유형으로 초기화 될 때 벡터에서 여분의 데이터를 얻을 수 있습니까?" 질문을 다시 말해 주시겠습니까? –

답변

1

사실, 제대로 작동합니다. Microsoft는 wchar_t 값 (short int 초이며 windows에서 utf16 코드 문자를 나타냄)을 검사하기를 원하므로 디버거에서 short intwchar_t으로 표시합니다. 그것은 단지 해석의 문제 일뿐입니다.

데이터에 char을 사용했다면 거의 모든 아키텍처에서 동일한 현상이 발생합니다.

+0

감사합니다. 잠시 후에 벡터가 채워지지 않기 때문에 다른 문제가있을 수 있습니다. 그래서 나는 데이터 문제가 있다고 생각하고 실제로 그 숫자가 정확한지 확인해야한다. 그것은 이상한 리눅스에서 잘 작동합니다. 그러나 그 int 뒤의 여분의 문자는 어디에서 왔습니까? 메모리에서 임의의 조각? 편집 : 신경 쓰지 마세요, 나는 그 부분이 L이 성격이라고 생각합니다 ...? 전에 생각 해봐야 겠어, 다시 한번 고마워! – SveinT

+0

은 /를 나타내며 /를 나타낼 수 있습니다.''T [N]'배열의 인코딩을 자동으로 관리하는 데이터 유형' –

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

대신 표준 : : 벡터의 vec3_t 사용.

Windows에서 wchar_t는 unsigned short와 같지만 유닉스에서는 4 바이트이므로 코드를 이식하기 쉽게 자신 만의 벡터 유형을 만들어야합니다.

+0

유닉스에서 얼마나 길지는 모르겠지만 (4 바이트는 로케일 요구 사항을 따르는 경향이 있습니다). –

0

모든 것이 잘 작동합니다. wchar_t는 플랫폼의 부호없는 short와 동의어이므로 디버거는 표시 할 이름을 알지 못합니다. 또한 '더 많은 정보'가 삽입되어 있지 않습니다. MSVC 디버거는 숫자를 와이드 문자로 해석합니다.