2010-12-09 15 views
8

Necesito codificar una cadena de aproximadamente 1000 caracteres que puede tener cualquier valor de byte (00-FF). No quiero usar Hex porque no es lo suficientemente denso. el problema con base64, como yo lo entiendo, es que incluye +/y = que son caracteres que no puedo tolerar en mi aplicación.codificación base64 que no usa caracteres "+/=" (más o iguales)?

¿Alguna sugerencia?

+3

En realidad, eso no es un problema con base64, es un problema con su aplicación. – JeremyP

+1

Me gusta @JeremyP dijo. Si su aplicación no puede tolerar '+' '/' y '=', entonces debería estar muy, muy preocupado. – lenswipe

Respuesta

3

Como dice Ciaran, base64 no es terriblemente difícil de implementar, pero puede desea buscar bibliotecas existentes que le permitan especificar un conjunto personalizado de caracteres para usar. Estoy bastante seguro de que hay mucho por ahí, pero no has especificado para qué plataforma necesitas esto.

Básicamente, solo necesita 65 caracteres ASCII que son aceptables, preferiblemente además de los saltos de línea.

+4

¿Cómo es esta la respuesta aceptada, no ofrece ninguna solución. – xApple

6

Si son solo esos caracteres particulares los que le molestan, y puede encontrar otros caracteres para usar en su lugar, ¿qué le parece implementar su propio módulo base64 personalizado? No es tan difícil.

1

Sure. ¿Por qué no escribir su propio codificador/decodificador Base64, pero reemplace esos caracteres en su algoritmo? Claro, no podrá decodificarse con un decodificador normal, pero si eso no es un problema, entonces ¿por qué preocuparse? Pero, es mejor que tenga al menos otros 3 caracteres que SON utilizables en su aplicación para representar el +/y = 's ...

+0

Suponiendo que no se requiere relleno (normalmente =), solo se necesitan dos caracteres no alfanuméricos. –

+0

Sí, pero no estoy seguro de que sea una suposición que quieras hacer ... A menos que sepa CON seguridad que su longitud de datos * SIEMPRE * será la misma, y ​​luego eso no lo arregla para actualizaciones futuras cuando él agrega un nuevo campo o algo así, y de repente todo su código B64 se rompe, y él no sabe por qué ... – LarryF

10

Elija sus reemplazos. Considere algunas otras variantes: base64 Variant table from Wikipedia.

Mientras codificador base64/decodificadores están trivial, posibilidad de sustitución de reemplazo se puede hacer de un simple paso de procesamiento pre/post de un funciones base64 codificación/decodificación (dentro de envolturas) existente - no hay necesidad de reinventar la rueda (completamente). O, mejor aún, como señala el Sr. Skeet, encuentre una biblioteca existente con suficiente flexibilidad.

Si no tiene caracteres alternativos adecuados "divertidos" para elegir (tal vez todos los demás caracteres no son válidos dejando sólo los 62 caracteres alfanuméricos para elegir), que siempre puede utilizar un carácter de escape de una muy ligera (~ 3/64?) Aumento en el tamaño. Por ejemplo, 0 (A) se codificaría como "AA", 62 (+) se codificaría como "AB" y 63 (/) se codificaría como "AC". Esto también podría hacerse como un paso previo/posterior si no desea escribir su propio codificador/decodificador desde cero. La desventaja de este enfoque es que la relación entre los caracteres de salida y los bytes de entrada no es fija.

1

En su lugar, puede usar Base32. Menos denso que Base64, pero elimina por completo los caracteres no deseados.

+0

Base32 todavía usa =, que no puede usar ... Pero, podría sustituir eso por otro char, solo tiene que preocuparse por 1, en lugar de 3 ... – LarryF

+1

@LarryF: el relleno se puede omitir si se puede detectado de alguna otra manera, ¿no? – sharptooth

7

Base58Check es una opción. Está comenzando a convertirse en algo así como un estándar de facto en las direcciones de criptomonedas.

mejoras básicas sobre base 64:

  • Sólo caracteres alfanuméricos [0-9a-zA-Z]
  • No hay aspecto similar caracteres: 0OIl/0OIl
  • Sin puntuacion para activar el ajuste de línea o salto de línea en documentos y mensajes de correo electrónico
  • También puede seleccionar el valor completo con un simple doble clic debido a la ausencia de puntuación.

El Bitcoin Address Utility es un ejemplo de implementación; orientado para Bitcoins.

Nota: Un nuevo estándar de facto puede no ser adecuado para sus necesidades. No está claro si el método de codificación Base58Check se formalizará en current protocols.

+0

He querido una codificación como esta durante media década, me gustaría haberlo sabido antes. –

+1

Y aquí hay una implementación lista para usar de Base58 en C# https://gist.github.com/dotnetchris/8e99ef70a6fcb3bd445ef1f3505f7087 –

Cuestiones relacionadas