En una cadena binaria larga, ¿cómo podría usted (o una computadora) saber dónde están los saltos de caracteres?

Me gustaría ampliar la respuesta de Vladislav Zorov para agregar que la sincronización automática no es una propiedad necesaria , y los códigos de sincronización automática son, de hecho, un subconjunto de la categoría más general de códigos de prefijo . Un código de prefijo es aquel que asigna caracteres a palabras de código binario de modo que ninguna palabra de código coincida El prefijo o el comienzo de otra palabra de código. Esencialmente, todas las codificaciones de caracteres a palabras de código binario son códigos de prefijo.

El primer caso, como se usa en codificaciones similares a ASCII, es asegurarse de que su código sea un código de prefijo asegurándose de que todos los caracteres tengan la misma longitud en bits. Si todos los caracteres tienen la misma longitud, ningún carácter puede aparecer como una subcadena de otro en ningún lugar , y mucho menos como un prefijo. La principal ventaja de este método es que es realmente fácil encontrar el comienzo y el final de un carácter (generalmente están alineados en bytes) y, por lo tanto, operaciones como “charAt ()” y “substring ()” no son más difíciles que indexación y corte de matrices. La principal desventaja es que desperdicia espacio y ancho de banda representando caracteres comunes como “” (espacio) usando la misma cantidad de bits que caracteres poco comunes como “²”.

El segundo caso, como se usa en el Código Morse y similares, es asegurarse de que su código sea un código de prefijo mediante el uso de un símbolo ‘fuera de banda’ para indicar un salto de carácter. En la práctica, esto es idéntico a la adición de esta secuencia de bits (que no puede aparecer dentro de una palabra de código) al final de cada palabra de código de caracteres, lo que hace imposible que cualquier carácter sea un prefijo de otro. Este método rara vez se usa en contextos digitales binarios como lo indicó Zorov. La ventaja de espacio de tener longitudes de palabras de código que varían según el uso se pierde tan pronto como se agrega la secuencia de bits de “corte” adicional, por lo que en realidad no hay ventajas en la práctica para este método.

El tercer caso, utilizado por UTF-8, es permitir que los caracteres abarquen varios bytes / fragmentos, pero dejar que uno de los bits en cada byte / fragmento indique si este es el último byte en este carácter o si el siguiente byte es parte de El mismo personaje. He usado este método para otros fines en el pasado, y definitivamente tiene muchas ventajas. Si ninguno de los caracteres necesita abarcar múltiples bytes (como si todos fueran ASCII), entonces el acceso aleatorio de tiempo constante todavía es posible como en el primer caso. Esto se pierde tan pronto como un carácter necesita varios bytes, pero dado que los inicios de los caracteres todavía están alineados con los bytes y solo se necesita verificar un bit en cada byte, los tiempos de búsqueda para “charAt ()” aún pueden ser rápidos. Por último, a pesar de que es menos eficiente en espacio que la siguiente estrategia, todavía permite que los personajes más populares tengan representaciones más cortas. En el caso de UTF-8, también se sincroniza automáticamente, debido a que los bits que verifica siempre aparecen en los mismos lugares y sirven como códigos de sincronización.

El cuarto caso, como se usa en los códigos de Hamming, es permitir que la longitud de una palabra de código sea cualquier número de bits y simplemente construir los símbolos de tal manera que se asegure de que sean un código de prefijo. El código de Hamming es en realidad la forma más eficiente de espacio para hacer esto, y construir un código que coincida aproximadamente con los datos de frecuencia de los caracteres utilizados se realiza muy rápidamente en la práctica. No es tan rápido leer una secuencia de caracteres de esta codificación como lo es en los métodos anteriores, ya que los datos tienen que leerse bit por bit, definitivamente es una muy buena compensación de espacio / ancho de banda y velocidad. Además, este método no tiende a sincronizarse automáticamente. Debe ver la transmisión desde el principio para asegurarse de obtener los caracteres correctos.

Existen métodos para codificar cadenas como binarias que no sean códigos de prefijo. La codificación aritmética se conoce como el medio más eficiente en el espacio para codificar cadenas de símbolos en datos de frecuencia dados binarios para su uso, pero elimina por completo la idea de que un símbolo tenga una representación fija. En su lugar, toma la secuencia de bits como representación de un rango de símbolos, con cada bit de lectura reduciéndose a la mitad el espacio de probabilidad en el que está buscando. Un salto de carácter / palabra / símbolo solo se determina cuando el rango cae completamente dentro del rango asignado a un símbolo particular. Los rangos asignados a los símbolos pueden cambiar con cada salida de símbolos si los datos están disponibles para hacerlo. Como resultado, la lectura de una cadena en los símbolos de sus componentes debe realizarse en orden desde el principio y puede ser muy lenta. Sin embargo, el ahorro de espacio y ancho de banda es inmenso. (Probablemente no hace falta decir que no hay nada que se sincronice automáticamente con esta codificación).

En el código ASCII, el carácter siempre es un entero y tiene 8 bits de longitud. Entonces 0110000101100010

es 01100001 (97) ‘a’ y 01100010 (98) o b. Un espacio se decodifica de la misma manera 00100000 (32).

Y entonces la cadena binaria para esta pequeña oración de ejemplo en ASCII es:

[matemática] 010000010110111001100100 \ color {verde} {00100000} 0111001101101111 [/ matemática]

[matemáticas] \ color {verde} {00100000} 011101000110100001100101 \ color {verde} {00100000} 01100010 [/ matemáticas]

[matemáticas] 011010010110111001100001011100100111100100101101 [/ matemáticas]

[matemáticas] 011100110111010001110010011010010110111001100111 [/ matemáticas]

[matemáticas] \ color {verde} {00100000} 011001100110111101110010 \ color {verde} {00100000} 01110100 [/ matemáticas]

[matemáticas] 011010000110100101110011 \ color {verde} {00100000} 0110110001101001 [/ matemáticas]

[matemática] 01110100011101000110110001100101 \ color {verde} {00100000} 01100101 [/ matemática]

[matemática] 011110000110000101101101011100000110110001100101 [/ matemática]

[matemáticas] \ color {verde} {00100000} 0111001101100101011011100111010001100101 [/ matemáticas]

[matemática] 011011100110001101100101 \ color {verde} {00100000} 0110100101101110 [/ matemática]

[matemáticas] \ color {verde} {00100000} 0100000101010011010000110100100101001001 [/ matemáticas]

[matemáticas] \ color {verde} {00100000} 011010010111001100111010 [/ matemáticas]

También denoté los puntos dobles y coloreé los espacios con la ayuda del programa de matemáticas aquí (también puse los saltos de línea, pero esto debería ser una cadena continua).

Para traducir la cadena (con espacios y todo) a ASCII, utilicé este pequeño código de Python (para marcar los gráficos simplemente ponerlos en la matriz de marcas), ejecuto:

print (binaryASCIIString (“Y así, la cadena binaria para esta pequeña oración de ejemplo en ASCII es:”, [”], “\ color {green} {“, “}”, 6)) para mi salida.

def binaryASCIIString (st, mark = [], leftmarker = “|”, rightmarker = “|”, breaksAllXLines):
i = 0
r = “”
para s en st:
si está en la marca:
r + = marcador izquierdo
r + = bin (ord (s)) [2:]. zfill (8)
si está en la marca:
r + = marcador derecho
si i == breaksAllXLines-1:
r + = “\ n”
i = 0
más:
i + = 1
volver r

Hay tres formas:

  1. Acordamos de antemano que usaremos n bits por carácter, por lo que solo lee n, lee n, lee n …
  2. Estamos de acuerdo con un “patrón de interrupción”, alguna palabra de código que no se utilizará para nada más, que podamos usar para separar los caracteres. Por ejemplo, si 00 no es un carácter válido o parte del carácter, podemos usar 00 para separarlos.
  3. Usamos código de sincronización automática, donde las palabras válidas en el lenguaje de código se eligen de manera que las interrupciones se puedan deducir del contenido mismo.

En la práctica, para el texto en una computadora se usan 1) y 3) (el primero en ASCII, UTF-32 y otros, el segundo en UTF-8).

Sin conocer las reglas de cómo analizar la cadena, no lo haría. Tampoco una computadora.

Una vez que se conocen las reglas, una persona o una computadora pueden proceder a buscar lo que sirve como un ‘salto de carácter’ en la cadena. La diferencia es que la computadora sería un poco más rápida (juego de palabras).

More Interesting

¿Por qué Windows solo tiene virus, no I-OS Linux, Mac, Android y todos los demás sistemas operativos comunes?

¿Cómo puede alguien aprender ciencias de la computación usando el pensamiento de los primeros principios?

¿Qué está vendiendo IBM ahora?

Para una dirección virtual donde P = pg. no. y d = pg. offset ¿podemos decir P = dirección virtual / tamaño de página yd = dirección virtual% tamaño de página?

¿Qué podemos aprender de los principios del aprendizaje automático?

¿La controversia del FBI de Apple expondrá la duplicidad del mundo que creemos que existe?

¿Cuál es la diferencia entre memoria de rango único y memoria de doble rango?

¿Qué documentos abordan Cloud Computing, NoSQL y Database as a Service desde una perspectiva científica?

¿Son obligatorios los campos de marca en los datos publicitarios de BLE?

Mis auriculares no reproducen sonido de alta frecuencia, parece estar con un cableado defectuoso. Pero, ¿por qué solo se bloquean los sonidos de alta frecuencia? ¿Es esto físicamente posible?

En la era de Global Grid Computing, ¿cómo siguen siendo relevantes las supercomputadoras?

¿Por qué la noción de un sistema operativo para múltiples usuarios es tan omnipresente?

¿Hay algún autómata celular bien conocido e interesante?

¿Es cierto que un título en informática es útil solo si puedo ingresar a una universidad superior como MIT o Stanford, y es mejor ser un desarrollador autodidacta en lugar de estudiar en una universidad mala?

¿Cuáles son algunos conjuntos de habilidades aparte de la programación que debe desarrollar un estudiante de CS?