string을 바이트로 표현

gyubong park·2021년 12월 2일
0

작업을 하다보면 어떤 값에서 바이트로 표현해야 되는 경우가 있다
그럴 경우를 대비하여 샘플을 올려본다

    // 원본 데이터, 길이가 16이지만 2글자가 하나의 바이트이다, 즉 8바이트
    string guid = "758b4edde123a9b8";

    // 바이트로 변환했을 때 담을 array
    uint8_t buf_data[8] = {0};
    
    // string --> char로 변환
    char hexstring[sizeof(uint64_t)*2+1];
    memcpy(hexstring, guid.data(), sizeof(uint64_t)*2);
    hexstring[sizeof(uint64_t)*2] = 0;
    cout << "hexstring : " << hexstring << endl;

    // 8바이트 문자열을 uint64_t 변수에 담아준다
    uint64_t stringToHex = (uint64_t)strtol(hexstring, NULL, 16); //16진수로 표현
    cout << "stringToHex : " << stringToHex << endl;

    for(int i = 0; i < 8; i++){
        // 맨 끝자리부터 8개(1바이트)씩 끊어서 넣어줌
        buf_data[8 -1-i] = (stringToHex >> (i*8));
        cout << 8 -1-i << " byte : " << (stringToHex >> (i*8)) << endl;
    }

    for(auto val : buf_data){
        printf("%u ", val);
    }
    cout << endl;

    return 0;

위 코드를 실행해보면, string이 char로 변환되어

hexstring : 758b4edde123a9b8
stringToHex : 8469950239072299448

char array에 값이 들어갔음을 확인할 수 있고 또한 uint64_t 변수에 값이 들어가 8469950239072299448 값으로 표현됨을 확인할 수 있다
이 값을 1바이트씩 비트연산자를 통해 값을 끊어내면 아래와 같이

7 byte : 8469950239072299448
6 byte : 33085743121376169
5 byte : 129241184067875
4 byte : 504848375265
3 byte : 1972063965
2 byte : 7703374
1 byte : 30091
0 byte : 117

이게 뭐지? 하는 값으로 표현되는데 이는 2진수로 표현했을 때 뒤의 8자리씩 줄어든 값이다

// buf_data
117 139 78 221 225 35 169 184 

최종적으로 buf_data에 들어간 0에 위치한 값을 보면 동일하게 117이 나오는 것을 볼수 있다
즉, hexstring의 758b4edde123a9b8에서 앞의 1byte는 75이고 이는 이진수로 0111 0101로 표현이 되고 01110101을 10진수로 표현하면 117이 된다

profile
초보 개발자

0개의 댓글