programing

c 정수의 get nth 바이트

yellowcard 2023. 6. 9. 21:56
반응형

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

반응형