2010-12-07 6 views
2

어머나 완전히 내 깊이에서 벗어나고 내 두뇌가 상처 받기 시작합니다. :(24 비트 정수를 3 바이트 배열로 변환하는 방법은 무엇입니까?

3 바이트 배열에 맞도록 정수를 변환해야합니다 (24 비트 정수입니까?). 다음 다시 전송/소켓을 통해 바이트 스트림에서이 번호를받을

내가 가진 :

NSMutableData* data = [NSMutableData data]; 

int msg = 125; 

const void *bytes[3]; 

bytes[0] = msg; 
bytes[1] = msg >> 8; 
bytes[2] = msg >> 16; 

[data appendBytes:bytes length:3]; 

NSLog(@"rtn: %d", [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] intValue]); 

//log brings back 0 

나는 나의 주된 문제는 내가 참으로 변환 한 것을 확인하는 방법을 모르는 것 같다 내 int는 데이터를 전송하는 데 필요한 변환 백입니다.

도움을 주시면 감사하겠습니다!

답변

1

: int로

union convert cvt; 
cvt.i = ... 
// now you can use cvt.c[0], cvt.c[1] & cvt.c[2] 

바이트로 변환하기 :

union convert cvt; 
cvt.i = 0; // to clear the high byte 
cvt.c[0] = ... 
cvt.c[1] = ... 
cvt.c[2] = ... 
// now you can use cvt.i 

참고 : 사용 노조에

union convert { 
    int i; 
    unsigned char c[3]; 
}; 

가 바이트 INT에서 변환을 이 방식은 프로세서 바이트 순서에 의존합니다. 내가 준 예제는 x86과 같은 소형 엔디안 시스템에서 작동합니다.

+0

이것은 훌륭합니다 ...주의 사항은 무엇입니까? – loststudent

0

포인터의 속임수는 어떻습니까?

int foo = 1 + 2*256 + 3*65536; 
const char *bytes = (const char*) &foo; 
printf("%i %i %i\n", bytes[0], bytes[1], bytes[2]); // 1 2 3 

프로덕션 코드에서이 코드를 사용하려고 할 때주의해야 할 사항이 있지만 기본 아이디어는 제정신입니다.

6

32 비트 정수가 있다고 가정합니다. 그래, 난 더 최적 있다는 것을 잘 알고 있어요,

// Shift each byte to its proper position and OR it into the integer. 
int msg = ((int)bytes[2]) << 16; 
msg |= ((int)bytes[1]) << 8; 
msg |= bytes[0]; 

을 그리고 :

int msg = 125; 
byte* bytes = // allocated some way 

// Shift each byte into the low-order position and mask it off 
bytes[0] = msg & 0xff; 
bytes[1] = (msg >> 8) & 0xff; 
bytes[2] = (msg >> 16) & 0xff; 

정수로 다시 3 바이트를 변환하려면 : 당신은 하단 24 비트가 바이트 배열에 넣고 싶어 그것을하는 방법. 위의 목표는 명확합니다.

당신은 노조 사용할 수
+0

+1 엔디안에 잘 어울립니다. – JeremyP

+0

숫자가 <255이면 이것이 잘 작동합니다. 24 비트 정수의 최대 값은 무엇입니까? – loststudent

+0

@loststudent : 아니요, 24 비트 부호없는 int의 최대 값은 (2^24) -1 또는 16,777,216입니다. 부호 첨부의 24 비트 int의 범위는 -8,388,608 ~ 8,388,607입니다. 어떤 부분이 작동하지 않습니까? –

관련 문제