boost serilaize 에서, 아키브 save_banary 내부 중 이해 안가는 부분
글쓴이: ikpil / 작성시간: 목, 2009/10/15 - 8:21오후
std::size_t tail = count % 3; if(tail > 0){ *oi++ = '='; if(tail < 2) *oi = '='; }
위 코드는
boost/archive/impl/basic_text_oprimitive.ipp 에 있는 save_binary 함수의 끝의 코드입니다.
std::ofstream 으로 특정 메모리의 값을 count 변수 만큼 복사하여 출력 한 후에
마지막으로 std::ofstream의 끝에
count 의 3으로 나눈 나머지의 값에 따라서
'=' 를 넣는 과정이 이해가 안갑니다.
아마도 메모리의 경계를 표시하게 위해서 '=' 를 넣은거 같은데,
질문
1. 왜 하필 '=' 을 넣나요?
2. 왜 홀수 일 때만 '=' 를 하나만 넣고., 짝수 일 때만 '=' 를 두개 넣나요?
Forums:
우선 홀수/짝수가
우선 홀수/짝수가 아닙니다. %3이므로 0, 1, 2가 가능하고, 0일때는 넣지 않고, 1일때는 두개를 넣고, 2일때는 하나를 넣는 코드입니다.
소스코드를 안봤으므로 추측해보자면 아마 인코딩 단위가 3바이트 단위이기 때문에, 3바이트가 안되는 크기를 넣을때 빈자리를 채우기위해서가 아닐까 생각합니다.
왜 하필 '='인 이유는 모르겠네요. 그냥 magic number와 비슷할 듯합니다.
'='으로 빈자리를 채워넣고, 3바이트단위 인코딩이라면 혹시 base64를 써서 인코딩하는 걸지도 모르겠습니다.
오!! 0보다 큰 경우
오!!
0보다 큰 경우 군요!
base64 맞습니다.
http://www.ikpil.com
궁금한게 있습니다.
궁금한게 있습니다.
1. 왜 하필 3바이트로 인코딩 하나요?
http://www.ikpil.com
3 바이트로 인코딩
3 바이트로 인코딩 하는게 아니고 3 바이트를 인코딩하는거죠. 4 바이트로.
이해가 잘
이해가 잘 안되요.
만약 4바이트를 출력 해야 한다면, 뒤에 2바이트를 더 붙여 6바이트로 만드는거 아닌가요?
만약 3바이트로 출력 해야 한다면, 뒤에 아무것도 붙이지 않고 그냥 끝내는거 아닌가요?
http://www.ikpil.com
참고
http://par.sarang.net/369
완전 감사합니다!
완전 감사합니다!
http://www.ikpil.com
1 바이트를
1 바이트를 인코딩하려면 = 두개를 붙여 3바이트(24비트)로 만들고 이를 6비트 씩 4단위로 나누어 각 6비트를 아스키 문자로 표현하여 4 바이트가 출력됩니다.
즉, 인코딩해야 할 바이너리 데이타가 3 바이트 단위가 되어야 이를 4 바이트 단위로 인코딩할 수 있죠.
따라서 인코딩한 결과물은 원래보다 4/3 으로 증가하게 됩니다.
6비트 씩 자르느 이유는 아스키 코드 중 실제로 표현 가능한 문자로 표현(a-z, A-Z, 0-9, +2 )하기 위함입니다.
이해 안가는 부분이
이해 안가는 부분이 있지만, base64에 대해서 더 조사하면 알 수 있을것 같습니다.
http://www.ikpil.com
인코딩을 만들고
인코딩을 만들고 있는데, 알고리즘이
1. 3바이트 단위로 읽는다.
2. 1번 에서 읽은것을 6bit 00 ?? ?? ?? 단위로 읽는다.
3. 2번에 읽은 6bit를 8bit 00 00 00 00 에 붙여 00 ?? ?? ?? ?? 으로 만든다.
4. 이것을 출력 한다.
.. 이게 인코딩 맞나요?
http://www.ikpil.com
1. 3바이트 단위로
1. 3 바이트(24 비트) 단위로 읽는다.
2. 1번 에서 읽은 바이너리 데이터를 6 비트 단위로 잘라 4개의 바이너리 데이터로 만든다.
3. 2번에서 만든 각각의 6 bit 바이너리 데이타에 해당하는 아스키 코드(64개로 표현 가능)를 룩업 테이블에서 찾는다.
4. 각각의 아스키 코드를 1 바이트로 하여 총 4 바이트를 출력 한다.
완전 이해했습니다.
완전 이해했습니다. 감사합니다.
http://www.ikpil.com
댓글 달기