2012-04-27 4 views
2

Windows HIVE 파일에서 기본 블록을 읽으려고합니다. 파일의 처음 4 바이트는 "regf"매직 넘버를 포함합니다. 이 문자열은 ANSI이지만 유니 코드 문자열도 있습니다. MarshalAs 특성을 지정하고 형식을 ByValTStr로 설정하면 올바르게 작동하지만 유니 코드 문자열은 읽지 않습니다. MSDN에 따르면 ByValTStr을 사용하면 배열의 형식이 포함 된 구조의 문자 집합에 의해 결정됩니다. 문제는 전체 문자 세트를 유니 코드로 설정하면 마법 번호 (처음 4 바이트)를 읽을 수 없다는 것입니다.구조체 정렬, ansi 및 유니 코드 모두 마샬링

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)] 
public string MagicNumber; 

전체 구조가 아닌 특정 문자열에 대한 문자 집합을 변경하려면 어떻게해야합니까?

또한 LPStr 유형을 사용하려고하지만 전혀 작동하지 않습니다.

[MarshalAs(UnmanagedType.LPStr, SizeConst = 5)] 
public String MagicNumber; 

"regf"매직 넘버 대신 marshalign을 사용하면 읽을 수없는 문자가 나옵니다.

어떻게 해결할 수 있습니까?

미리 감사드립니다. 대신 ByValArray

+0

문자열 만 사용하여 추가 구조체를 위장하여이를 수행 할 수 있습니다. 여기서는 작동하지 않으며 0으로 끝나는 문자열이 아닙니다. byte [] 또는 int32로 마샬링하는 것이 맞습니다. 그것은 숫자입니다. –

답변

2

원수가 :

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] 
public byte[] MagicNumber; 

당신은 문자열로 필요하지 않습니다 그리고 당신은 문자열로 설정하면 Marshaller의 아마 실패 할 것이다. 당신의 정의에서 당신은 5 문자 스트링 (4 문자 + 널 터미네이터)으로 정의되어있다. 그러나 HIVE 파일은 매직 넘버 뒤에 널 터미네이터를 가지지 않을 것이다. 파일의 다섯 번째 바이트는 다른 필드이다.

파일을 struct에 직접 매핑하려는 시도는 어쨌든 작동하지 않을 수 있습니다. struct은 메모리 레이아웃 (적절한 패딩 및 널 종결 문자열과 같은 가정)을 정의하며 일반적으로 디스크 포맷은 잘 배치 된 구조에 직접 매핑되지 않습니다. 아마도 파일을 byte[] 버퍼로 읽고 그것을 수동으로 분석하는 것이 더 나을 것입니다.

+0

그래, 아마 맞을거야. 나는 문자열로 그것을 정말로 필요로하지 않는다, 정수로 마샬링 할조차 수있다. 그게 내 문제를 해결하지만 한 구조에서 유니 코드와 안시 문자열을 모두 가질 수있는 방법이 있다면 여전히 흥미로울 것입니다. 귀하의 답변에 감사드립니다. – axe

관련 문제