2010-12-09 3 views
1

나는 내가 생각할 수있는 모든 것을 시도했으며 아무 것도 할 수 없습니다. VB.Net에서 작성한 이진 파일은 기본적으로 다음 데이터의 배열 크기를 나타내는 이진 데이터로 float 형식의 정수로 구성됩니다. 파일이 VB.Net에서 잘 쓰고, 나는 ++ 잘 다음 코드를 사용하여 비주얼 C를 통해 다시 읽을 수 있습니다 : 이것은 456780의 정확한 값을 반환파일에서 간단한 데이터 형식으로 바이트를 추출하는 방법은 무엇입니까?

ifstream output("c:\\out.ipv", ios::in | ios::binary); 
UInt32 len; 
UInt32 *ptr2 = (UInt32*)&len; 
output.read((char*)ptr2, 4); 

를, 바이트는 : 76, 248, (6) 나는 내 아이 패드에서 동일한 코드를 실행하면 내가 아래 다른 방법 사용하는 경우 0, 내가 1043089572.를 얻을 :

NSData *data = [[NSData alloc] initWithContentsOfFile:filePath]; 
UInt32 num; 
const NSRange numV = {0, 4}; 
[data getBytes:&num range:numV]; 

이 코드는 다른 값, 124,724을 반환합니다, 나는 방법을 잘 모르겠어요 정확한 바이트가 파일에서 가져 오는 것을 읽으십시오. 그게 내가 알아 내려고 시도했지만 작동하지 못했던 다른 것입니다. Visual C++에서 작동하는 동일한 방법이 iPad에서 작동하지 않는 이유는 무엇입니까? 나는이 사실을 놓치고있다.

답변

1

확인, 정말 이상한 일이 내 데이터에서 진행되고 있습니다. Visual C++과 objective-c에서 원시 바이트 값을 살펴 봤는데 전혀 동의하지 않습니다. 나는 파일의 처음 4 바이트를 읽고 값을보고있다. 이 시점에서 나는 올바르게 읽지 못한다고 가정하고 있지만, 내가 무엇을 놓치고 있는지 모른다. 나는 바이트 값을보고 사용하고 비주얼 C++ 코드는 다음과 같습니다 다음의 tmp 배열의

ifstream input("c:\\out.ipv", ios::in | ios::binary); 
Byte tmp[4]; 
input.read((char*)&tmp[0], 4); 

값은 다음과 같습니다

76 
248 
6 
0 

내가 목표 - C에서 같은 일을하는 경우 :

ifstream input([filePath UTF8String], ios::in | ios::binary); 
Byte tmp[4]; 
input.read((char*)&tmp[0], 4); 

내가 얻을 :

164 
72 
44 
62 

무엇을 제공합니까? 적어도 동일한 바이트 값을 가져야합니다. 나는에 문제가 오전 4 바이트를 포함하는 파일은 여기에 있습니다 : newout1.ipv

편집 : 사람들은 바이트 어레이 intial 값과 같습니다 164,72,44,62 바이트 값이 어디에서 오는지 나는 깨달았다

내가 그 안에 아무것도 넣기 전에. 어떤 이유로 든 줄이 :

input.read((char*)&tmp[0], 4); 

아무 것도하지 않습니다. 그것이 왜 파일에서 읽지 않는지에 대한 아이디어가 있습니까?

최종 편집 : 그것은 나를 정말 바보 보이게하기 때문에

OK, 나는 아마이에 대한 답변을 게시하지해야하지만, 나는이 글을 읽는 사람이 혼란스러워하고 싶지 않아요. 그래서 배열과 객체는 무엇을 상관없이 항상 같은 값을 반환했습니다. 할당 된 값은 무엇이든지간에있었습니다. 나는 파일 이름이 너무 많아서 읽지 않으려 고 노력했다. 파일 이름을 수정하면 모든 것이 정확히 예상대로 작동했습니다. 혼란을 가져 주어서 유감스럽게 생각합니다.

+4

문제를 해결하고 문제를 해결하는 데 도움을 주셔서 감사합니다. 전체 솔루션을 제공하는 것은 StackOverflow 커뮤니티에 적합합니다. 한 가지 사소한 단점 : 원래의 질문을 편집하여 업데이트를 제공하기 위해 새로운 "답변"을 게시하는 대신 시도한 것에 대한 업데이트를 제공해야합니다. 그것은 좋은 형태와 일반적인 StackOverflow 연습 모두 질문을 유지하고 답변 섹션에서 진짜 대답을 가지고 있습니다. 즉, 질문에 대한 답변을 제공하는 것은 (귀하가 최종 편집에서했던 것처럼) 절대적으로 좋으며 칭찬할만한 것입니다. –

1

이것은 엔디안 문제와 같습니다. <libkern/OSByteOrder.h>의 기능을 사용하여 지정된 엔디안의 데이터를 읽을 수 있습니다. 귀하의 경우에는 다음과 같은 작업을 수행 할 수 있습니다.

NSInputStream *istream = [NSInputStream inputStreamWithFileAtPath:filePath]; 
UInt32 num = 0; 
if (istream) { 
    uint8_t buffer[4]; 
    if ([istream read:buffer maxLength:4] == 4) { 
     num = OSReadLittleInt32(buffer, 0); 
    } else { 
     // there weren't 4 bytes in the file 
    } 
} else { 
    // the file could not be opened 
} 
+0

나는 이것을 시도했지만 여전히 원래 숫자와 관련이없는 값을 나에게 주었다. 내 문제는 아래의 새 게시물에서 설명했던 내용과 더 밀접한 관계가 있다고 생각합니다. – Davido

관련 문제