boost serilaize 에서, 아키브 save_banary 내부 중 이해 안가는 부분

ikpil의 이미지

    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. 왜 홀수 일 때만 '=' 를 하나만 넣고., 짝수 일 때만 '=' 를 두개 넣나요?

klyx의 이미지

우선 홀수/짝수가 아닙니다. %3이므로 0, 1, 2가 가능하고, 0일때는 넣지 않고, 1일때는 두개를 넣고, 2일때는 하나를 넣는 코드입니다.
소스코드를 안봤으므로 추측해보자면 아마 인코딩 단위가 3바이트 단위이기 때문에, 3바이트가 안되는 크기를 넣을때 빈자리를 채우기위해서가 아닐까 생각합니다.
왜 하필 '='인 이유는 모르겠네요. 그냥 magic number와 비슷할 듯합니다.
'='으로 빈자리를 채워넣고, 3바이트단위 인코딩이라면 혹시 base64를 써서 인코딩하는 걸지도 모르겠습니다.

ikpil의 이미지

오!!

0보다 큰 경우 군요!
base64 맞습니다.

ikpil의 이미지

궁금한게 있습니다.

1. 왜 하필 3바이트로 인코딩 하나요?

ifree의 이미지

3 바이트로 인코딩 하는게 아니고 3 바이트를 인코딩하는거죠. 4 바이트로.

ikpil의 이미지

이해가 잘 안되요.

만약 4바이트를 출력 해야 한다면, 뒤에 2바이트를 더 붙여 6바이트로 만드는거 아닌가요?

만약 3바이트로 출력 해야 한다면, 뒤에 아무것도 붙이지 않고 그냥 끝내는거 아닌가요?

bootmeta의 이미지

ikpil의 이미지

완전 감사합니다!

ifree의 이미지

1 바이트를 인코딩하려면 = 두개를 붙여 3바이트(24비트)로 만들고 이를 6비트 씩 4단위로 나누어 각 6비트를 아스키 문자로 표현하여 4 바이트가 출력됩니다.
즉, 인코딩해야 할 바이너리 데이타가 3 바이트 단위가 되어야 이를 4 바이트 단위로 인코딩할 수 있죠.
따라서 인코딩한 결과물은 원래보다 4/3 으로 증가하게 됩니다.
6비트 씩 자르느 이유는 아스키 코드 중 실제로 표현 가능한 문자로 표현(a-z, A-Z, 0-9, +2 )하기 위함입니다.

ikpil의 이미지

이해 안가는 부분이 있지만, base64에 대해서 더 조사하면 알 수 있을것 같습니다.

ikpil의 이미지

인코딩을 만들고 있는데, 알고리즘이
1. 3바이트 단위로 읽는다.
2. 1번 에서 읽은것을 6bit 00 ?? ?? ?? 단위로 읽는다.
3. 2번에 읽은 6bit를 8bit 00 00 00 00 에 붙여 00 ?? ?? ?? ?? 으로 만든다.
4. 이것을 출력 한다.

.. 이게 인코딩 맞나요?

ifree의 이미지

1. 3 바이트(24 비트) 단위로 읽는다.
2. 1번 에서 읽은 바이너리 데이터를 6 비트 단위로 잘라 4개의 바이너리 데이터로 만든다.
3. 2번에서 만든 각각의 6 bit 바이너리 데이타에 해당하는 아스키 코드(64개로 표현 가능)를 룩업 테이블에서 찾는다.
4. 각각의 아스키 코드를 1 바이트로 하여 총 4 바이트를 출력 한다.

ikpil의 이미지

완전 이해했습니다. 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.