2016-11-23 2 views
0

우리가 몇 년 전에 가지고 있던 32 비트에서 64 비트 스텝에 관한 일반적인 질문보다 더.32 비트 및 64 비트 호환성을 어떻게 올바르게 보장합니까?

디스크에 저장하는 앱이 있고 다른 사용자에게 전송할 수 있다고 가정합니다. 32 비트 시스템에서 전송할 수 있으며 64 비트에서 읽을 수도 있고 그 반대로 읽을 수도 있습니다. 내가 32 비트에

[NSData dataWithBytes:&thedata length:sizeof(long)];

와 디스크에 물건을 작성하는 경우

는 sizeof의 4되며 64 비트에 8. 일단 디스크에 기록 될 것입니다 그것입니다 서면 다운 바이트 '와 상대방은 자신의 길이로 그것을 읽을 것이다.

작동하도록하려면 모든 길이를 일관되게 유지하는 기본 요소로 모두 캐스팅해야합니다.

만약 내가 NSInteger을 사용한다면 모든 조건절 일 수있는 모든 typedef와 같은 경우가 아니라는 것을 이해합니다. 그러나 프리미티브조차도 안전하지 않습니다. intfloat은 현재 사용 중이지만 long은 변경되었습니다. 어떻게 안전하게 유지되는 프리미티브로 작업 할 수 있습니까?

미래를 가져올 수도 알고 ...

그래서이 전투하는 최선의 전술 무엇인가? 당신은 길이가 32 비트 및 64 비트 시스템에서 동일 보장해야 할 때마다

+0

"응용 프로그램이 32 비트 프로세스에서 64 비트 값을 읽으려는 경우가 드물지만'decodeIntegerForKey :'(32 비트 프로세스를 다시 읽지 않고'decodeIntegerForKey : 비트 32 비트 시스템에서). " https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Cocoa64BitGuide/ConvertingExistingApp/ConvertingExistingApp.html#//apple_ref/doc/uid/TP40004247-CH5-SW1 – matt

+0

앱에서 무엇을 모르는 경우 시스템에 의해 작성된?모두 가지고있는 파일입니다. – NikkyD

+2

시스템 식별자를 데이터 스트림에 써야합니다. 아카이브 버전 #도있을 것입니다. 정말로 필요하지 않으면 새로운 데이터 형식을 고안하지 않는 것이 좋습니다. NSArchiver 또는 CoreData 또는 속성 목록 등을 사용하십시오 ... – bbum

답변

2

다시 물러나지 않게하는 가장 좋은 방법은 그것을하지 않는 것입니다. 엄지 손가락의 매우 일반적으로

, 뭔가 (즉, floatNSInteger, int64_t가, ...)가 직접 NSData으로 디스크에 기록하거나 포장해서는 안됩니다 포드에서 개최됩니다.

사용 사례 그것에 대해 이동하는 가장 간단한 방법은 NSDictionary에서 다음 읽기와 쓰기 것을 고집 다음 (NSNumber+numberWithInteger: 사용) NSNumberNSInteger 스틱, 그리고 아마입니다 +dictionaryWithContentsOfURL-writeToURL:atomically:와 .

당신이 절대적으로 NSData에 필요한 경우

뿐만 아니라, 그 트릭있다 :

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:aDictionary]; 

NSDictionary *anotherDictionary = 
    (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData]; 

이 방법으로, 당신은 (상대적으로)있을거야 전화 번호가 상처, 상관없이 시스템에 남아 안심이 에 전송됩니다.

+0

사전에서 왜 안전할까요? 그 뒤에있는 이유는 무엇입니까? – NikkyD

+0

@ NikkyD 음, 실제로 NSNumber가 안전합니다. NSNumber를 사용하여 위의 모든 작업을 수행 할 수 있습니다. 그 이유는 NSKeyedCoding, NSNumber, NSDictionary 같은 것들이 개발되었을 때, 개발자들은 다른 폭으로 들어가는 모든 문제를 생각했을 것입니다 (어쩌면 당시 16과 32 였을 것입니다). 다른 엔디안, 바이트 크기 및 기타 모든 배관 재료가 필요하지 않으므로 –

+0

@NikkyD 기본적으로 Cocoa API는 잘 정의 된 형식 (예 : 'NSPropertyListSerialization' 또는 NSKeyedArchiver에 의해 생성 된 형식)으로 작성된'NSNumber '가 다른 버전의 OS, 플랫폼 등. 작업을 수행하고 새로운 아카이브 형식을 만드는 대신 (귀하의 질문에 언급 된 bbum과 같이) Apple은 동일한 효과를 보장하기 위해 Apple이 수행 한 작업을 사용할 수 있습니다. –

-1

, 당신은 바이트 배열이 변환하는 방법 특정 유형의 int32_t, int64_t ...

을 사용할 수 있습니다/NSDatahere를 찾을 수 있습니다.

+0

질문의 첫 부분은 오해의 소지가 있으며, NikkyD가 피하려고하는 바를 정확하게 보여줍니다. 64 비트 시스템에서 NSInteger를 인코딩하면 64 비트의 가치가있는 데이터; 32 비트 시스템에서 이것을 'NSInteger'라고 읽으면 32 비트 만 읽습니다. (그리고 그 반대도 마찬가지입니다.)'long '을 사용할 때와 같은 문제입니다. –

관련 문제