c 정수의 get nth 바이트
첫 번째 바이트는 다음을 사용하여 얻을 수 있습니다.
int x = number & ((1<<8)-1);
또는
int x = number & 0xFF;
하지만 저는 정수의 n번째 바이트를 얻는 방법을 모릅니다.예를 들어, 1234는 32비트 정수로 00000000000000000100 11010010입니다. 이 모든 바이트를 얻으려면 어떻게 해야 합니까?첫 번째는 210, 두 번째는 4, 마지막 두 번째는 0입니다.
int x = (number >> (8*n)) & 0xff;
여기서 n은 첫 번째 바이트의 경우 0, 두 번째 바이트의 경우 1 등입니다.
(n+1)번째 바이트가 메모리에 나타나는 순서에 상관없이 (x86과 같은 리틀 엔디언 기계에서는 가장 작은 것에서 가장 중요한 것이기도 함):
int x = ((unsigned char *)(&number))[n];
빅 엔디언 시스템에서 최하위에서 최상위까지의 (n+1)번째 바이트의 경우:
int x = ((unsigned char *)(&number))[sizeof(int) - 1 - n];
최소에서 최대 유의(모든 엔디안)까지 (n+1)번째 바이트의 경우:
int x = ((unsigned int)number >> (n << 3)) & 0xff;
물론, 이 모든 것들은n
<sizeof(int)
그 밖에number
이다.int
.
int nth = (number >> (n * 8)) & 0xFF;
가장 낮은 바이트로 가져가서 "익숙한" 방식으로 가져갑니다.
바이트가 필요한 경우 더 나은 해결책은 다음과 같습니다.
byte x = (byte)(number >> (8 * n));
이렇게 하면, 당신이 돌아와서 int 대신 바이트를 처리하기 때문에, 우리는 더 적은 메모리를 사용하고 있고, 우리는 바이너리와 연산을 할 필요가 없습니다.& 0xff
결과를 바이트 단위로 마스킹하기 위해서입니다.질문을 하는 사람이 예문에 인트를 사용한 것도 봤는데, 그게 맞는 말이 아닙니다.
이 질문이 오래 전에 나온 질문이라는 것을 알지만, 저는 방금 이 문제에 부딪혔고, 어쨌든 이것이 더 나은 해결책이라고 생각합니다.
//was trying to do inplace, would have been better if I had swapped higher and lower bytes somehow
uint32_t reverseBytes(uint32_t value) {
uint32_t temp;
size_t size=sizeof(uint32_t);
for(int i=0; i<size/2; i++){
//get byte i
temp = (value >> (8*i)) & 0xff;
//put higher in lower byte
value = ((value & (~(0xff << (8*i)))) | (value & ((0xff << (8*(size-i-1)))))>>(8*(size-2*i-1))) ;
//move lower byte which was stored in temp to higher byte
value=((value & (~(0xff << (8*(size-i-1)))))|(temp << (8*(size-i-1))));
}
return value;
}
언급URL : https://stackoverflow.com/questions/7787423/c-get-nth-byte-of-integer
'programing' 카테고리의 다른 글
Android 전화기의 전화 번호를 프로그래밍 방식으로 가져옵니다. (0) | 2023.06.09 |
---|---|
Yum이 키보드 인터럽트 오류와 함께 충돌했습니다. (0) | 2023.06.09 |
다른 시트의 테이블 데이터를 참조하는 Vlookup (0) | 2023.06.09 |
외부 캐시 공급자가 있는 ASP.NET MVC 출력 캐시 속성 (0) | 2023.06.09 |
에뮬레이터의 "이 앱은 Firebase 인증을 사용할 수 있는 권한이 없습니다." (0) | 2023.06.09 |