작업을 하다보면 어떤 값에서 바이트로 표현해야 되는 경우가 있다
그럴 경우를 대비하여 샘플을 올려본다
// 원본 데이터, 길이가 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이 된다