2012-10-18 10 views
4

으로 작성된 이진 파일을 읽는 중입니다. Microsoft Visual Studio 2010 Express에서 C++의 fstream 라이브러리를 사용하여 이진 데이터 파일 (* .mgr 확장자 -> 내 회사 응용 프로그램에서만 사용됨)을로드하는 DLL을 만듭니다. 이 파일은 Delphi를 사용하고있는 회사의 다른 누군가가 개발 한 응용 프로그램으로 만들어집니다. 그는 처음 15 바이트는 파일이 만들어진 날짜를 나타내는 문자와 앱의 버전과 같은 다른 것들이어야한다고 말합니다 :FStream은 Delphi의 이진 작성기

"XXXX 2012".

다음 (바이너리 모드) fstream로로드하고 fstream (문자열 모드) 다른 파일을 기입 한 후의 결과는 다음

"[] XXXX 2 0 1 2"

첫 문자는 알 수없는 char (직사각형) 다음 각 char 사이에 공백이 있습니다. 마지막으로 31 바이트 폭입니다. 실제 문자의 경우 15 개, 공백의 경우 15 개, rect char = 31의 경우 1 개입니다.

기타 정보 :저는 C++을 사용하고 있으며, 응용 프로그램 개발자는 Delphi를 사용하고 있습니다. fstream을 사용하고 있습니다. 그는 BW.Write() 함수를 사용하고 있습니다. (BW == Binary Writer?) 그는 Windows XP Professional을 사용하면서 Windows 7을 사용합니다.

문제 진단을 할 수 있습니까? 사전에

감사

먼저 편집 : 그 첫 번째 바이트를로드 C++ 코드를 추가 해요.

먼저 그는 embarcadero Rad Studio XE2에서 Delphi XE2를 사용하고 있습니다.

내가 아는 것에서 PChar는 일반 문자 (1 바이트)와 반대로 폭이 2 바이트 인 widechars (delphi 2009 이후)로 구성된 널 종료 문자열입니다. 기본적으로 그는 바이트 대신 단어를 저장합니다. 우리가 30 바이트를 얻을 수 있도록

wchar_t header[15]; 
DXFLIBRARY_API void loadMGR(const char* szFileName, const char* szOutput) 
{ 
fstream file; 
file.open(szFileName, ios::binary | ios::in); 
if(file.is_open()) 
{ 
    file.read(reinterpret_cast<char*>(header),sizeof(header)); 
} 
file.close(); 

//zapis 

fstream saveFile; 
saveFile.open(szOutput, ios::out); 
if(saveFile.is_open()) 
{ 
    saveFile.write(reinterpret_cast<const char*>(header),sizeof(header)); 
} 
saveFile.close(); 
} 

헤더 (15 개)의 wchar_t의의를 포함

여기 MGR를로드하는 코드입니다. 조사한 후에 나는 변환하는 방법을 모른다.

+2

스택 오버플로에 오신 것을 환영합니다. 친절한 조언. 이와 같은 질문에는 코드가 포함되어 있습니다. 파일을 읽고 텍스트 스트림을 작성하는 코드가 도움이되었을 것입니다. 또한 Delphi 버전이 중요합니다.두 가지 델파이 분열, 즉 유니 코드 이전과 유니 코드 이후가 있습니다. 동료가 사용하는 버전은 무엇입니까? –

답변

5

어딘가에있는 데이터가 8 비트 텍스트 인코딩과 16 비트 인코딩 사이에서 엉망이되고있는 것처럼 보입니다. 가짜 첫 문자는 거의 확실하게 UTF-16 BOM입니다.

한 가지 가능한 설명은 Delphi 개발자가 UTF-16 인코딩 텍스트를 파일에 쓰고 있다는 것입니다. 그리고 아마 8 비트 인코딩을 기대하고 있습니다.

또 다른 설명은 델파이 코드가 8 비트 텍스트를 올바르게 쓰고 있지만 코드가 그것을 망가 뜨리고 있다는 것입니다. 아마도 당신의 읽기/쓰기 코드가 그렇게 할 것입니다.

델파이 프로그램의 파일 출력에 16 진수 편집기를 사용하여 맹 글링이 발생하는 곳을 정확히 좁히십시오.

질문에 코드가 없으면 이보다 더 구체적이지 않습니다.

+1

개발자가 이전 버전에서 D2009 +로 업그레이드했을 수 있으므로 Ansi의 문자열이 이제 유니 코드입니다. 그는 특히 AnsiString 또는 ShortString을 사용해야합니다. (그리고 문자열에있는 바이트를 유지하는 것은 다소 사기성이지만, 또 다른 문제입니다 ...) –

+1

@DavidM 실제로 바이트가 아닌 텍스트처럼 보입니다. 그리고 아마 모두 <128 일 것입니다. 그래서 AnsiString은 괜찮을 것입니다. –

+0

그는 불행히도 여기 ATM에 없지만 컴퓨터에 몰래 들어 와서이 줄을 추출했습니다. BW.Write (PChar ('MG-XXX-XXX-2012')); Pchar은 무엇입니까? 내 첫 번째 추측 그것은 C- 문자열 해당 (char 테이블 포인터?) – user1756573