Discussão:Código Natural/Notação posicional: mudanças entre as edições

De Documentação
Sem resumo de edição
 
(4 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 2: Linha 2:
== Notação de código-prefixo ==
== Notação de código-prefixo ==


Quando a base é conhecida, ao invés de apenas expressar <code>12345</code>, se queremos destacar o prefixo "12" da parte significativa do identificador, temos {{CodeP|12|345}}.
Quando a base é conhecida, ao invés de apenas expressar <code>12345</code>, se queremos destacar o prefixo "12" da parte significativa do identificador, temos {{CodeP|12|345}} com o template <nowiki>{{CodeP|12|345}}</nowiki>. Na falta da notação de destaque usar um ponto, <code>12.345</code>.


== Exemplos da RFC 4648 ==
== Exemplos da RFC 4648 ==
Linha 31: Linha 31:


Como 16²=256 podemos dispensar a conversão de equivalente numérico, já que um dígito base&nbsp;256 resulta sempre exatamente em 2 dígitos base&nbsp;16. Para dispensar o equivalente numérico na conversão para base&nbsp;64 é mais complicado, precisamos esperar por 3 dígitos base&nbsp;256 para obter exatamente 4 dígitos base&nbsp;64: 256<sup>3</sup>&nbsp;=&nbsp;64<sup>4</sup>&nbsp;=&nbsp;16777216. Portanto se o número de bytes a serem convertidos para a base&nbsp;64 não for múltiplo de 3, será necessário o "padding", e o valor não preservará hierarquia.
Como 16²=256 podemos dispensar a conversão de equivalente numérico, já que um dígito base&nbsp;256 resulta sempre exatamente em 2 dígitos base&nbsp;16. Para dispensar o equivalente numérico na conversão para base&nbsp;64 é mais complicado, precisamos esperar por 3 dígitos base&nbsp;256 para obter exatamente 4 dígitos base&nbsp;64: 256<sup>3</sup>&nbsp;=&nbsp;64<sup>4</sup>&nbsp;=&nbsp;16777216. Portanto se o número de bytes a serem convertidos para a base&nbsp;64 não for múltiplo de 3, será necessário o "padding", e o valor não preservará hierarquia.
== Algoritmos oficiais de conversão hexa ==
Provavelmente os mais  eficientes e maduros sejam C e C++, para converter unsignedint to hexa:
Conforme Utility library https://en.cppreference.com/w/cpp/utility/chars_format
* generico diversas baeses, https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/charconv#L107
* __to_chars_16  https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/charconv#L176
* ... inversa (prefix 0x or 0X indicating hexadecimal base - applies only when the base is 16 or ​0​), https://en.cppreference.com/w/cpp/string/basic_string/stol
Outras dicas sobre a conversão em C:
* sprintf o mais popular, https://stackoverflow.com/a/9636892/287948
* algoritmos similares, https://stackoverflow.com/a/4966309/287948

Edição atual tal como às 18h16min de 6 de janeiro de 2024

Notação de código-prefixo

Quando a base é conhecida, ao invés de apenas expressar 12345, se queremos destacar o prefixo "12" da parte significativa do identificador, temos 12345 com o template {{CodeP|12|345}}. Na falta da notação de destaque usar um ponto, 12.345.

Exemplos da RFC 4648

O escopo da RFC 4648 é a expansão de bytes para o modo textual. Partimos do valor do byte, que equivale a uma notação base256:

   ASCII("a")=97;   ASCII("b")=98
   ASCII("f")=102;  ASCII("o")=111
   "fo" = 102*256 + 111 = 26112 + 111 = 26223

Em seguida, a cada sequência de bytes, converte-se o equivalente numérico como se fosse notação Base256:

  • f256 = [102]10 = 6616
  • fo256 = [26223]10 = 666F16
    ou, destacando a função de conversão, BASE16(fo256) = 666F16
  • BASE16(foo256) = 666F6F16
  • ...

Na RFC foi destacada a função de conversão, conforme reproduzido abaixo, da seção 10 da RFC 4648:

   BASE16("") = ""
   ...
   BASE16("foo") = "666F6F"
   ...
   BASE64("") = ""
   BASE64("f") = "Zg=="
   BASE64("fo") = "Zm8="
   BASE64("foo") = "Zm9v"
   BASE64("foobar") = "Zm9vYmFy"

Como 16²=256 podemos dispensar a conversão de equivalente numérico, já que um dígito base 256 resulta sempre exatamente em 2 dígitos base 16. Para dispensar o equivalente numérico na conversão para base 64 é mais complicado, precisamos esperar por 3 dígitos base 256 para obter exatamente 4 dígitos base 64: 2563 = 644 = 16777216. Portanto se o número de bytes a serem convertidos para a base 64 não for múltiplo de 3, será necessário o "padding", e o valor não preservará hierarquia.

Algoritmos oficiais de conversão hexa

Provavelmente os mais eficientes e maduros sejam C e C++, para converter unsignedint to hexa:

Conforme Utility library https://en.cppreference.com/w/cpp/utility/chars_format

Outras dicas sobre a conversão em C: