[CS] OS byte order

SOEUN CHOI·2023년 1월 10일
0

CS_study

목록 보기
1/2

{참고자료}
Endian
bit order
LSB/MSB
비트연산자
비트 마스크
비트 마스킹

byte / bit

컴퓨터는 모든 데이터를 2진수로 처리

bit

data 최소 단위
2진수값인 '0', '1' 두 값 중 하나로 저장

byte

문자 표현이 가능한 최소 단위
8bits = 1 byte
0x00 ~ 0xFF
0b00000000~0b11111111

[C++/C] 진수 표기법

10진수 (data)
2진수는 0b(data)
8진수는 0(data)
16진수는 0x(data)

int a = 100;        // 10진수로 표현한 100
    int b = 0b01100100;    // 2진수로 표현한 100
    int c = 0144;    // 8진수로 표현한 100
    int d = 0x64;    // 16진수로 표현한 100

bit - MSB / LSB

MSB

Most Significant bit
최상위 비트

signed / unsigned data 따라 정보가 달라짐

LSB

Least Significant bit
최하위 비트

데이터의 홀짝 / 난수발생 함수, 해시 함수, checksum 확인

bit

2진수의 최상위 최하위 bit를 파악
하나의 데이터에서 처음과 끝 및 방향 파악
MBS < ---- LSB

serial 통신시
송수신의 방향 유의

byte order

컴퓨터 메모리에 바이트가 저장 되는 순서

Big Endian 빅엔디안

낮은 주소에 MSB 부터 저장

32bit 0x12345678
byte로 저장시 0x12 0x34 0x56 0x78 로 저장

Little Endian 리틀엔디안

낮은 주소에 LSB 부터 저장

32bit 0x12345678
byte로 저장시 0x78 0x56 0x34 0x12 로 저장

대부분의 인텔 CPU 계열에서 사용


내가 어려웠던 것

  1. byte order 저장 방식을 읽는 것
    메모리에는 Little Endian로 저장
    하지만 읽어올때는 사람이 읽는 방향과 같다
    memcyp시 packet 값을 낮은 주소에 LSB로 저장
    0x3DB 값의 4 bytes packet DB 03 00 00
    data 가공시 유의 필요
    > 1byte씩 처리 또는 bit operation으로 가공

  2. 읽어 오는 packet 크기에 따라 data 값이 변경됨
    packet 값 32bits
    00 00 AA AA

    32bits로 읽어오면
    Little endian 0xAAAA0000
    Big endian 0x0000AAAA

    하지만 16bit로 뒤에만 읽어오면
    둘다 0xAAAA로 같다

    packet 값 16 bits
    12 34

    16bits로 읽어오면
    Little endian 0x3412
    Big endian 0x1234

    Packet에 보이는 data 그대로 값이 아니라 OS rule에 따라 packet 값이 다를게 확인 될 수 있음
    구현시 주의 할 것.


bitwise operator

비트 연산자 [C++/C 기반]

기본 연산자

연산자연산기능
&비트 단위 AND연산
|비트 단위 OR연산
^비트 단위 XOR연산
~단항 연산자 모든 피연사자 비트 반전

^연산자

두 개의 비트가 서로 다른 경우에 1을 반환

연산결과
0 ^ 00
0 ^ 11
1 ^ 01
1 ^ 10

~연산자

0에서 1로, 1에서 0으로 반전시키는 NOT 연산/ 보수연산
signed의 경우 MSB가 반전되어 부호가 바뀜 주의

int num1 = 15; //00000000 00000000 00000000 00001111
int num2 = ~num1; // 11111111 11111111 11111111 11110000

Shift

left shift <<

비트를 왼쪽으로 이동 남은 자리는 0으로 채움
A * 2^B 연산과 동일
A << B
A의 비트 열을 B칸씩 왼쪽으로 이동
범위값을 넘어가면 값이 사라짐 주의

uint8_t num = 3; //0000 0011 
uint8_t shift num = num << 4; // 0011 0000

right shift >>

비트를 오른쪽으로 이동 남은 자리는 0으로 채움
A / 2^B 연산과 동일
A >> B
A의 비트 열을 B칸씩 오른쪽으로 이동
범위값을 넘어가면 값이 사라짐 주의

uint8_t num = 7; //0000 0111 
uint8_t shift num = num >> 2; // 0000 0001

Shift 연산은 범위값에 아주 유의 하여야한다

bit mask

비트를 바스킹 하는 기법

  1. 모든비트 0
int num = 0 //00000000 00000000 00000000 00000000
  1. 모든비트 1
int num = -1 //11111111 11111111 111111111
  1. 특정 비트 삭제
    특정위치만 0 나머지 1 후 and 연산 해주기

  2. 특정 비트만 포함 시키기
    특정 위치만 1 나머지 0 후 or 연산 해주기

  3. 특정 비트 포함 여부 확인
    해당 위치만 1 나머지 0 후 and 연산 해주기

  4. 특정 비트 토글
    해당 위치만 1하여 XOR 연산 수행하기
    토글
    하나의 설정 값으로부터 다른 값으로 전환
    1>0, 0>1

  5. 마지막 비트 구하기
    보수 체계 이용
    num과 -num의 and 연산 수행

  6. 마지막 비트 삭제 하기
    보수 체계 이용
    num과 num-1의 and 연산 수행

data type

자료형 [C++/C 기반]

기본 자료형

크기가 표시된 정수 자료형을 사용하면 bit 계산시 유용하다
data를 원하는 만큼만 잘라서 사용하기 용이

int main( void ) 
{
   int8_t a;
   int16_t b;
   int32_t c;
   int64_t d;

   uint8_t e;
   uint16_t f;
   uint32_t g;
   uint64_t h; 
}

Signed / unsigned 의 차이로 음수를 적용하는 지 파악
> unsigned의 경우 2의 보수 이용이 안된다.

bool은 실제로 1bit지만 1byte만큼 차지 한다

data 값이 U를 붙이면 unsigned인 값이 된다

uint8_t a = 10U;

unsigned long a = 0UL;

0   // normal number is interpreted as int
0L  // ending with 'L' makes it a long
0LL // ending with 'LL' makes it long long
0UL // unsigned long

0.0  // decimal point makes it a double
0.0f // 'f' makes it a float
profile
soeun choi

0개의 댓글