2012-03-08 3 views
0

n 바이트의 버퍼가 있지만 바이트 3의 sizeof (something) 바이트 만 읽으면됩니다. 즉, 버퍼에서 1 바이트와 2 바이트를 읽지 않으려는 것입니다. 예를 들어 ...memmove에 "lseek"가 있습니까?

일부 버퍼의 경우 바이트 1 = 'a', 바이트 2 = 'b', 바이트 3 = uint64_t 변수입니다. 내가 뭘 원하는

1. set begin to byte 3 
2. read in sizeof(uint64_t) bytes from buffer using memmove 
+3

포인터 수학과 캐스팅이 너무 힘들어요? –

답변

2

, 설명의 비트. C 배열 인덱싱은 1이 아닌 0에서 시작하므로 바이트 0은 'a'이고 바이트 1은 'b'입니다. 둘째로, 세 번째 바이트는 uint64_t 변수를 포함 할 수 없지만, 인덱스 2는 인 개체의 시작 일 수 있습니다.

아니요, memmove()에 해당하는 lseek은 없습니다. 파일 작업과 달리 memmove()을 호출하면 시작 지점을 지정해야하기 때문입니다.

그리고이 경우 memmove() 대신 memcpy()을 사용할 수도 있습니다. 둘 사이의 유일한 차이점은 memmove()이 중복 버퍼를 올바르게 처리한다는 것입니다. 원본과 대상이 별개의 개체이기 때문에 걱정할 필요가 없습니다. 코드의 속도에 큰 영향을주지는 않지만 읽는 사람은 memmove()을 선택한 이유가 궁금하지 않아도됩니다.

을 감안할 때 : 나는 sizeof target보다는 sizeof (uint64_t)을 사용

memcpy(&target, buf+2, sizeof target); 

참고 :

unsigned char buf[SOME_SIZE]; 
uint64_t target; 

당신은 이런 식으로 뭔가를 할 수 있습니다. 둘 중 어느 것도 작동하지만 sizeof target을 사용하면 코드를보다 탄력적으로 만들 수 있습니다 (나중에 변경하면 오류에 덜 취약합니다). target 유형을 변경하려면 memcpy() 호출에서 유형을 변경하는 것을 기억할 필요가 없습니다.

0

같은 것이 왜 단순히이 사용되지 않습니다 : 첫째

uint64_t num; 
num = * ((uint64_t *) (buffer + 2)) 
+0

주소가 잘못 정렬되어 있으면 실패 할 수 있습니다. –

+0

오른쪽. 좋아, 당신은 어떤 종류의'memcpy'를 사용하는 것이 더 좋겠지 만, 나는 당신이 이미 그것을 설명하는 멋진 답변을 보았다. :) – xato