2016-11-08 6 views
1

저는 사용하고 싶은 4 바이트의 데이터 (부호없는 정수로 저장되어 있습니다)가 있습니다.버퍼를 부호없는 int로 변환하고 비트 마스크를 사용합니다.

이 1 바이트 데이터 인 경우에는, 이것을 이용하여 해결하고있다 :

자바
//Java 

buffer.get() & 0xFF 

//Objective-C 

uint32_t buffer; 
[data getBytes:&buffer range:NSMakeRange(2, 1)]; 
uint32_t payloadLength = buffer & 0xFFu; 
//data = d1021b53 
//buffer = 897307; payloadLength: 27 

, 바이트 4, 이것을 사용하여 수행되었다 :

//Java 

buffer.getInt() & 0xFFFFFFFFL 

//Current not working Objective-C code 
uint32_t buffer; 
[data getBytes:&buffer range:NSMakeRange(2, 4)]; 
uint32_t payloadLength = CFSwapInt32BigToHost(buffer); 
//data: 0103940f b7626361 
//buffer = 1656164244; payloadLength: 2484057954 (should be = ~80) 

Objective- 들어 C/C, 4 바이트 및 비트 마스크 작업에 어려움을 겪고 있습니다.

누구든지 도움이 필요합니까?

답변

1

4 바이트를 정수로 변환하려면 1 바이트 코드와 비슷한 작업을 수행 할 수 있지만 엔디안 순서를 처리해야합니다. 즉 4 바이트 주변의 어느 쪽이 저, 고 저장되어 있는지 알아야합니다 바이트 먼저.

uint32_t buffer; // or use int32_t if signed 

복사 바이트 :

그래서 4 바이트의 버퍼로 시작

[data getBytes:&buffer range:NSMakeRange(0, 4)]; 

을 그리고 호스트 순서에 바이트의 순서를 변환합니다. 데이터 인 경우 빅 엔디안은 수행

uint32_t payloadLength = CFSwapInt32LittleToHost(buffer); 

하고 작업이 완료 :

uint32_t payloadLength = CFSwapInt32BigToHost(buffer); 

또는 리틀 엔디안이 경우

.

+0

나는 이것을 사용하는 기쁨이 없었다. 나는 원래의 부호없는 int를 사용하기 위해 목적 - c 1 바이트 예제를 변경하는 것을 반영하도록 원본을 변경했습니다. CFSwapInt32BigToHost (또는 Little)를 4 바이트 값과 함께 사용하려고하면 결과를 알 수 없습니다. 위의 1 바이트 예제에서 사용하더라도 작동하지 않습니다. 자바 0xFFFFFFFF 비트 마스크를 복제하는 방법에 대한 다른 제안 사항이 있습니까? –

+0

이 경우 비트 마스크를 사용할 필요가 없습니다. 질문을 편집 할 수 있습니까 (주석에 코드를 넣는 것은 효과가 없습니다),이 답변을 바탕으로 현재 가지고있는 코드를 표시하고'NSLog (@ "% @ \ n % 8x \ n % 8x ", data, buffer, payloadLength)'? (길이가 길면'data'의 덤프 중 일부를 잘라냅니다!) – CRD

+0

게시물을 편집하여 예제 값을 표시하고 현재 무엇이 작동하지 않는지 보여줍니다. –

관련 문제