Diferencia entre ceros binarios y cero de caracteres ASCII

gcc (GCC) 4.8.1 c89 

Hola,

Estaba leyendo un libro sobre punteros. Y usando este código como muestra:

 memset(buffer, 0, sizeof buffer); 

Rellenará el búfer será cero binario y no el cero de carácter.

Me pregunto cuál es la diferencia entre el binario y el carácter cero. Pensé que era lo mismo.

Sé que los datos textuales son caracteres legibles por humanos y los datos binarios no son caracteres imprimibles. Corrígeme si estoy equivocado.

¿Cuál sería un buen ejemplo de datos binarios?

Para un ejemplo adicional, si está tratando con cadenas (datos textuales) debe usar fprintf . Y si está utilizando datos binarios, debe usar fwrite . Si desea escribir datos en un archivo.

Muchas gracias por las sugerencias,

La respuesta rápida es que el carácter '0' está representado en datos binarios por el número ASCII 48. Eso significa que cuando quiere el carácter '0' , el archivo realmente tiene estos bits: 00110000 . De manera similar, el carácter imprimible '1' tiene un valor decimal de 49, y está representado por el byte 00110001 . ( 'A' es 65 y se representa como 01000001 , mientras que 'a' es 97 y se representa como 01100001 ).

Si desea que el terminador nulo al final de la cadena, '\0' , tenga un valor decimal de 0, y así sea un byte de todos los ceros: 00000000 . Este es realmente un valor de 0 Para el comstackdor, no hay diferencia entre

 memset(buffer, 0, sizeof buffer); 

y

 memset(buffer, '\0', sizeof buffer); 

La única diferencia es una semántica para nosotros. '\0' nos dice que estamos tratando con un personaje, mientras que 0 simplemente nos dice que estamos tratando con un número.

Te ayudaría enormemente revisar una mesa de ascii .

fprintf genera datos utilizando ASCII y genera cadenas. fwrite escribe datos binarios puros. Si fprintf(fp, "0") , pondrá el valor 48 en fp, mientras que si escribe fwrite(fd, 0) , pondrá el valor real de 0 en el archivo. (Tenga en cuenta que mi uso de fprintf y fwrite obviamente no fue adecuado, pero muestra el punto).

Nota: Mi respuesta se refiere a ASCII porque es uno de los conjuntos de caracteres más antiguos y conocidos, pero como menciona Eric Postpichil en los comentarios, el estándar C no está vinculado a ASCII. (De hecho, si bien en ocasiones da ejemplos usando ASCII, el estándar parece ir más allá de su forma de suponer que ASCII será el conjunto de caracteres usado). fprintf utiliza el juego de caracteres de ejecución de su progtwig comstackdo.

Si está preguntando por la diferencia entre '0' y 0 , estos dos son completamente diferentes:

  • El cero binario corresponde a un carácter no imprimible \0 (también denominado carácter nulo), con el código de cero. Este carácter sirve como terminador nulo en la cadena C:

5.2.1.2 Un byte con todos los bits establecidos en 0, llamado el carácter nulo , deberá existir en el conjunto de caracteres de ejecución básico; se utiliza para terminar una cadena de caracteres.

  • El cero cero del carácter ASCII '0' es imprimible (no es sorprendente que produzca un cero del carácter cuando se imprime) y tiene un código decimal de 48.

Binario cero: 0
Carácter cero: '0' , que en ASCII es 48 .

Datos binarios: los datos sin procesar con los que la CPU puede jugar, bit tras bit, el flujo de 0s y 1s (generalmente organizados en grupos de 8, también conocidos como Bytes, o múltiplos de 8)

Datos de caracteres: bytes interpretados como caracteres. Convenciones como ASCII dan las reglas sobre cómo una secuencia de bits específica debe mostrarse por un terminal, una impresora, … por ejemplo, los datos binarios (secuencia de bits) 00110000 deben mostrarse como 0

si recuerdo correctamente, los tipos de datos enteros sin signo tendrían una coincidencia directa entre el valor binario de los bits almacenados y el valor interpretado (ignorar la extrañeza como Endian ^^).

En un nivel superior, por ejemplo, al hablar de transferencia ftp, la distinción se realiza entre:

  • los datos deben interpretarse como caracteres (múltiples) de bytes, también conocido como texto (esto incluye signos que no son de caracteres, como un salto de línea)
  • los datos son un bit / bytestream grande, que no se puede dividir en bits más pequeños legibles por humanos, por ejemplo, una imagen o un ejecutable comstackdo

En el sistema, todos los caracteres tienen un código y el código ASCII cero es 0x30 (hex). para llenar este búfer con cero caracteres debe ingresar este código:

 memset(buffer,30,(size of buffer))