Comando md5sum en modo binario y texto.

Comando md5sum en modo binario y texto.

El comando GNU md5sumtiene dos modos:binariomodo ytextomodo. Supongo que la diferencia está únicamente en cómo se manejan los caracteres de nueva línea. ¿Estoy en lo cierto?

En GNU/Linux, los dos modos siempre producen el mismo resultado, por lo que el único uso de las opciones -by -tes indicar la bandera ( *o ) utilizada antes del nombre del archivo.

¿En qué circunstancias los modos pueden producir resultados diferentes? ¿En sistemas Windows/MacOS? (¿Versiones disponibles para estas plataformas?)

Respuesta1

En GNU/Linux, los dos modos siempre producen el mismo resultado

Sí, explícitamente. De man md5sum:

Nota:No hay diferencia entre la opción de modo binario y texto en [sic] el sistema GNU.

Esto es de la md5sumimplementación que viene con GNU coreutils 8.21; Noto que una versión anterior (8.12) no tiene este aviso, pero supongo que ocurriría lo mismo de todos modos.

Aunque AFAICT md5sumno está estandarizado oficialmente (por ejemplo, por POSIX), está disponible en varias plataformas en varias implementaciones y obviamente hay algún esfuerzo para que sean compatibles entre sí para facilitar su uso en todos los sistemas.

En relación a esto, elNorma ISO/ANSI CIncluye funciones de flujo de alto nivel para acceder a archivos. Como parte del estándar, están disponibles en cualquier sistema operativo que implemente ISO C a través de una biblioteca compartida o un compilador. Dado que casi todos los sistemas operativos tienen esto disponible (y generalmente están escritos en C), es una especie de lenguaje universal utilizado para implementar software potencialmente muy portátil.

Teniendo en cuenta lo que hace, sería totalmente factible escribir un archivo md5sumque se compilara y funcionara en cualquier sistema operativo. No estoy afirmando que esto sea cierto para la versión GNU coreutils, pero una de las funciones de flujo de archivos de alto nivel mencionadas anteriormente es fopen(), que ISO C exige que incluya un binterruptor utilizado al abrir un archivo para indicar que se está abriendo "como binario". archivo". Lo que eso puede significar o requerir del sistemano esestipulado por el estándar, solo es necesario que exista para que pueda usarse en sistemas donde pueda haber algunos (cualquier) razón para ello.

No existe tal motivo en los sistemas operativos estilo Linux/POSIX/*nix, por lo que el conmutador no hace nada. De la especificación POSIX (un superconjunto de ISO C) paraabrir():

El carácter 'b' no tendrá ningún efecto, pero está permitido para la conformidad con el estándar ISO C.

Por lo tanto, una implementación completamente portátil md5sumpodría utilizar las funciones de flujo de archivos de alto nivel ISO, ya que no existen otros métodos para acceder a archivos en ISO C (la mayoría de las plataformas, incluidas las que cumplen con POSIX, también tienen sus propios métodos de nivel inferior, pero usarlos sería no ser portátiles porque no están en ISO C), y también debe implementar los indicadores -by -tpara agregar o no la bopción fopen()cuando lee el archivo. En sistemas donde eso no tiene sentido, no hará ninguna diferencia.

Nuevamente, no estoy diciendo que md5sum de GNU esté escrito de una manera completamente portátil o que se derive de uno que lo sea, pero obviamente está tratando de cumplir, en su operatividad, con uno que sí lo es. Tenga en cuenta que tener una bandera que no hace nada no es lo mismo que no tener la bandera; en el primer caso, se especifica que está bien pero no hace nada, mientras que en el último caso su uso podría ser un error o llevar acomportamiento indefinido.

Respuesta2

Como ya han dicho otros, en los sistemas GNU y en los Windows modernos, estas opciones no tienen ningún efecto.

Mirando el código fuente, cuando md5sumse usa con un archivo, las opciones de texto/binario determinan si el modeparámetro usado en fopen(const char *pathname, const char *mode)será "r"o "rb". En todos los sistemas compatibles con POSIX, bsimplemente se ignora y no tiene ningún efecto.

Cuando md5sumse lee la entrada estándar, coreutilsel modo predeterminado será textosi y sólo si todo lo siguiente es cierto:

  • la macro en tiempo de compilación O_BINARYestá definida (es decir, hay una diferencia entre los modos texto y binario),
  • la entrada proviene de un terminal
  • y el modo no se anula mediante una opción de línea de comandos.

De lo contrario, se asume el modo binario (a menos que lo anule la opción de línea de comandos) y, si O_BINARYestá definido, xset_binary_mode()se llama para la entrada estándar.

xset_binary_mode()esun contenedor definido en xbinary-io.hof gnulib.Si O_BINARYno está definido, será una función ficticia que cualquier buen compilador de C optimizará; por lo tanto, de nuevo, texto versus binario no termina teniendo ningún efecto incluso si la función se llama por algún motivo.

Pero cuando O_BINARYse defina, xset_binary_mode()será un contenedor para set_binary_mode(), declarado enbinary-io.hdegnulib. A partir de aquí, encontraremos las primeras pistas sobre entornos de programación en los que el "modo binario" realmente marca la diferencia:

#if O_BINARY
# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__
#  include <io.h> /* declares setmode() */
#  define __gl_setmode setmode
# else
#  define __gl_setmode _setmode
#  undef fileno
#  define fileno _fileno
# endif
#else
  /* On reasonable systems, binary I/O is the only choice.  */
  /* Use a function rather than a macro, to avoid gcc warnings
     "warning: statement with no effect".  */
BINARY_IO_INLINE int
__gl_setmode (int fd _GL_UNUSED, int mode _GL_UNUSED)
{
  return O_BINARY;
}
#endif

Aparentemente, __EMX__esEberhard Mattes eXtender, un entorno de programación en modo de 32 bits para MS-DOS y OS/2. Asimismo, __DJGPP__se refiere a laSistema de desarrollo DJGPP de 32 bits para MS-DOS. Y luego también estáCygwin. Todos estos entornos de programación se basan en setmode()archivos declarados en <io.h>.

Para otros entornos de programación que definen O_BINARY, _setmode()se utilizará (según lo definido por el entorno de programación respectivo).

Un ejemplo de sistemas operativos donde el modo texto frente al modo binario puede ser importante sería OpenVMS. También conoce la forma estilo Unix de almacenar texto como simplemente una secuencia de caracteres. En el mundo OpenVMS, esto aparentemente se conoce como Stream_LFformato, y el hecho de que tenga un nombre específico debería ser una pista de que esno es la única forma posible de formatear archivos de texto.

Para los curiosos:http://neilrieck.net/docs/openvms_notes_text_files.html

En resumen, en OpenVMS, el non-stream simple textformato de archivo contiene cero o más registros (líneas) cuyo tamaño máximo está definido en los metadatos del archivo (puede ser de hasta 32767 bytes). Cada línea tiene como prefijo un valor de 16 bits que indica el número de bytes en cada línea. No existe el "carácter de fin de línea": una línea finaliza cuando se ha leído el número especificado de bytes. Si el número de bytes en una línea es impar, 0x00se agrega un byte de relleno para que el comienzo de la siguiente línea esté en una dirección alineada con palabras. Este byte de relleno nunca se cuenta en la longitud de la línea.

GNU Coreutils ciertamente ha sidoportado a OpenVMS.

Respuesta3

Como complemento, agregaría información que en Windows md5sumtampoco tiene diferencia en el cálculo --texto en --binaryel modo. Probado en md5sum(GNU coreutils) 8.31 para Windows.

c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:35:52 PM
λ xxd unix-eol.txt
00000000: 7468 6973 2066 696c 6520 6861 7320 756e  this file has un
00000010: 6978 206c 696e 6520 656e 6469 6e67 730a  ix line endings.
00000020: 7468 6973 206d 6561 6e20 6974 2068 6173  this mean it has
00000030: 206f 6e6c 7920 4c46 0a                    only LF.

c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:08 PM
λ xxd win-eol.txt
00000000: 7468 6973 2066 696c 6520 6861 7320 7769  this file has wi
00000010: 6e20 206c 696e 6520 656e 6469 6e67 730d  n  line endings.
00000020: 0a74 6869 7320 6d65 616e 2069 7420 6861  .this mean it ha
00000030: 7320 2020 4352 204c 460d 0a              s   CR LF..

c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:15 PM
λ md5sum.exe --text *.txt
c8a8c7bb97ab554cff96a76b2a8f89fa  unix-eol.txt
03b3b1458cddff2cf1c15819b1255af3  win-eol.txt

c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:46 PM
λ md5sum.exe --bin *.txt
c8a8c7bb97ab554cff96a76b2a8f89fa *unix-eol.txt
03b3b1458cddff2cf1c15819b1255af3 *win-eol.txt

c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:57 PM
λ md5sum.exe --version
md5sum (GNU coreutils) 8.31
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Ulrich Drepper, Scott Miller, and David Madore.

información relacionada