base16.h.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <chapter xml:id="base16.h">
  2. <title><tt>__vic/base16.h</tt></title>
  3. <p>Кодировщик и декодировщик Base16.</p>
  4. <chapter xml:id="base16">
  5. <title><tt>base16</tt></title>
  6. <p>Класс, используемый как пространство имён. Содержит только типы, константы
  7. и статические функции. Создание объектов данного класса не предполагается.</p>
  8. </chapter>
  9. <chapter xml:id="base16--bad_format">
  10. <title><tt>base16::bad_format</tt></title>
  11. <code-block lang="C++">
  12. struct base16::bad_format : public std::exception {};
  13. </code-block>
  14. <p>Абстрактный базовый класс исключений.</p>
  15. </chapter>
  16. <chapter xml:id="base16--bad_digit">
  17. <title><tt>base16::bad_digit</tt></title>
  18. <code-block lang="C++">
  19. struct base16::bad_digit : public base16::bad_format
  20. {
  21. const char *what() const noexcept;
  22. };
  23. </code-block>
  24. <p>Класс исключений, бросаемый <xref to="base16--decode"/> если входная
  25. последовательность содержит символ, не являющийся шестнадцатеричной цифрой.</p>
  26. </chapter>
  27. <chapter xml:id="base16--bad_length">
  28. <title><tt>base16::bad_length</tt></title>
  29. <code-block lang="C++">
  30. struct base16::bad_length : public base16::bad_format
  31. {
  32. const char *what() const noexcept;
  33. };
  34. </code-block>
  35. <p>Класс исключений, бросаемый <xref to="base16--decode"/> если входная
  36. последовательность состоит из нечётного количества символов.</p>
  37. </chapter>
  38. <chapter xml:id="base16--status">
  39. <title><tt>base16::status</tt></title>
  40. <code-block lang="C++">
  41. enum class base16::status
  42. {
  43. ok,
  44. invalid_length,
  45. invalid_digit
  46. };
  47. using base16::status_t = base16::status; // for C++98
  48. </code-block>
  49. <p>Коды статусов разбора входной последовательности, возвращаемые
  50. <xref to="base16--try_decode"/>.</p>
  51. </chapter>
  52. <chapter xml:id="base16--encode_upper">
  53. <title><tt>base16::encode_upper()</tt></title>
  54. <code-block lang="C++"><![CDATA[
  55. // Bytes -> Text
  56. template<class ByteReader, class CharWriter>
  57. void base16::encode_upper(ByteReader reader, CharWriter writer);
  58. ]]></code-block>
  59. <p>Кодирует байты из <tt>reader</tt> и записывает результирующие символы во
  60. <tt>writer</tt>. Для шестнадцатеричных цифр используется верхний регистр.</p>
  61. <p><tt>ByteReader</tt> должен моделировать concept
  62. <tt>Reader&lt;unsigned char></tt>. См. <xref to="readers"/>.</p>
  63. <p><tt>CharWriter</tt> должен моделировать concept <tt>Writer&lt;char></tt>.
  64. См. <xref to="writers"/>.</p>
  65. <section><title>Пример</title>
  66. <code-block lang="C++"><![CDATA[
  67. #include<__vic/readers/string.h>
  68. #include<__vic/writers/string.h>
  69. using bytes = std::string;
  70. using bytes_reader = __vic::string_reader;
  71. std::string encode_base16(const bytes &s)
  72. {
  73. std::string res;
  74. res.reserve(s.length() * 2);
  75. __vic::base16::encode_upper(bytes_reader(s), __vic::string_writer(res));
  76. return res;
  77. }
  78. ]]></code-block>
  79. </section>
  80. </chapter>
  81. <chapter xml:id="base16--encode_lower">
  82. <title><tt>base16::encode_lower()</tt></title>
  83. <code-block lang="C++"><![CDATA[
  84. // Bytes -> Text
  85. template<class ByteReader, class CharWriter>
  86. void base16::encode_lower(ByteReader reader, CharWriter writer);
  87. ]]></code-block>
  88. <p>То же самое, что <xref to="base16--encode_upper"/>, но использует нижний
  89. регистр для шестнадцатеричных цифр.</p>
  90. </chapter>
  91. <chapter xml:id="base16--encode_byte_lower">
  92. <title><tt>base16::encode_byte_lower()</tt></title>
  93. <code-block lang="C++"><![CDATA[
  94. // Byte -> Text
  95. template<class CharWriter>
  96. void base16::encode_byte_lower(unsigned char byte, CharWriter writer);
  97. ]]></code-block>
  98. <p>То же самое, что <xref to="base16--encode_lower"/>, но кодирует
  99. единственный байт.</p>
  100. </chapter>
  101. <chapter xml:id="base16--encode_byte_upper">
  102. <title><tt>base16::encode_byte_upper()</tt></title>
  103. <code-block lang="C++"><![CDATA[
  104. // Byte -> Text
  105. template<class CharWriter>
  106. void base16::encode_byte_upper(unsigned char byte, CharWriter writer);
  107. ]]></code-block>
  108. <p>То же самое, что <xref to="base16--encode_upper"/>, но кодирует
  109. единственный байт.</p>
  110. </chapter>
  111. <chapter xml:id="base16--decode">
  112. <title><tt>base16::decode()</tt></title>
  113. <code-block lang="C++"><![CDATA[
  114. // Text -> Bytes
  115. template<class CharReader, class ByteWriter>
  116. void base16::decode(CharReader reader, ByteWriter writer);
  117. ]]></code-block>
  118. <p>Декодирует символы из <tt>reader</tt> и записывает результирующие байты во
  119. <tt>writer</tt>. Если входная последовательность имеет неправильный Base16
  120. формат, бросается исключение наследник <xref to="base16--bad_format"/>.</p>
  121. <p><tt>CharReader</tt> должен моделировать concept <tt>Reader&lt;char></tt>.
  122. См. <xref to="readers"/>.</p>
  123. <p><tt>ByteWriter</tt> должен моделировать concept
  124. <tt>Writer&lt;unsigned char></tt>. См. <xref to="writers"/>.</p>
  125. <section><title>Пример</title>
  126. <code-block lang="C++"><![CDATA[
  127. #include<__vic/readers/string.h>
  128. #include<__vic/writers/string.h>
  129. using bytes = std::string;
  130. using bytes_writer = __vic::string_writer;
  131. bytes decode_base16(const std::string &s)
  132. {
  133. bytes res;
  134. res.reserve(s.length() / 2);
  135. __vic::base16::decode(__vic::string_reader(s), bytes_writer(res));
  136. return res;
  137. }
  138. ]]></code-block>
  139. </section>
  140. </chapter>
  141. <chapter xml:id="base16--try_decode">
  142. <title><tt>base16::try_decode()</tt></title>
  143. <code-block lang="C++"><![CDATA[
  144. // Text -> Bytes
  145. template<class CharReader, class ByteWriter>
  146. base16::status_t base16::try_decode(CharReader reader, ByteWriter writer);
  147. ]]></code-block>
  148. <p>То же самое, что <xref to="base16--decode"/>, но возвращает
  149. <xref to="base16--status"/> отличный от <tt>base16::status::ok</tt> в случае
  150. неправильного формата входной последовательности вместо бросания исключений.</p>
  151. </chapter>
  152. </chapter>