Algoritmo de HJ-Split
February 14, 2008En una de mis tantas descargas de Anime, me encontré con un archivo de la serie Captain Tsubasa, que me pedía unirlo con el software HJ-Split. Esto me puso en una duda… ¿Que debía hacer?
Digo lo anterior porque he tenido malas experiencias con programas tipo Hacha, en los que los trozos cortados llegan mal o simplemente la unión da cualquier cosa menos el .avi prometido. En parte, la culpa la tienen los uploaders por no postear sumas de control MD5 o CRC-32 para comprobar la integridad de los archivos.
Sin embargo, decidí averiguar algo sobre HJ-Split. Pronto me enteré que no es un programa libre. Así que decidí buscar alguna alternativa libre antes de usar la versión propietaria. Hay que aclarar que no soy una persona que use exclusivamente software libre, pero lo trato de usar en la medida de lo posible. Además… podía bajar el .avi completo de otra fuente…
Mi búsqueda me llevó a lx-split, un proyecto libre que intenta ser compatible con HJ-Split en sistemas *NIX. Ya que estoy usando Windows para las descargas (Una cuestión de conveniencia, en realidad, ya que la computadora que manejo la usan otras personas), decidí bajar el código fuente para intentar compilarlo o analizar ese código. ¿Para algo sirve el Software Libre, no?
Me dí con la sorpresa de que la implementación de lx-split era partir archivos cuando estos alcanzen cierto tamaño y continuar en otro archivo el resto del archivo original. Y la unión era simplemente recrear esas partes en un archivo más grande.
En un sistema *NIX realizar esos pasos es tan sencillo como:
Cortar Archivos:
split -b [Tamaño_Corte_Bytes] [Archivo_Original]
Se generarán archivos del tipo xaa, xab, xac, xad…
Unir Archivos:
cat xaa xab xac … > [Archivo_Destino]
Así se creará el archivo final, llamado [Archivo_Destino]. La implementación de lxsplit hacía lo mismo.
Entonces la idea era probar eso en el software oficial de HJ-Split. Me instalé las extensiones GNU para Windows y cree un archivo de pruebas lleno de ‘foo’ con el siguiente comando:
yes "foo" > test.bin
Le di Control + C a los segundos y ya ocupada algo de 31.4 MB. Fue entonces cuando abrí HJ-Split e instruí al programa a que dividiera test.bin en trozos de 4 MB. Finalmente volví a la consola y ejecuté:
cat test.001 | tail
Que sorpresa me dí cuando vi lo siguiente:
foo
foo
foo
fo
Y cuando ejecute el siguiente comando cat con el test.bin.002, vi lo que faltaba:
o
foo
foo
Estaba claro que HJ-Split era simplemente una imitación de la función split de sistemas *NIX. El algoritmo se podría resumir en lo siguiente:
- Se abre un archivo de gran tamaño, supongamos test.bin.
- Se le pregunta al usuario el tamaño de las partes divididas (Usualmente en KB)
- Se crea el primer archivo de partes: test.bin.001
- Se lee el archivo y se almacena el contenido en test.bin.001 hasta alcanzar el tamaño de la parte 2.
- Se crea un segundo archivo test.bin.002 y se sigue copiando el resto del archivo hasta que tenga el tamaño de la parte 2.
- Se crea entonces un tercer archivo y se sigue así hasta acabar de recorrer todo el archivo.
Con eso se puede escribir una implementación compatible con HJ-Split original, ya que aún no ha incluído otras características, como suma MD5, compresión, etc.
Lamentablemente no he tenido tiempo de hacer una implementación propia de HJ-Split, pero prometo que cuando disponga de tiempo haré una implementación y la colgaré en este blog. La implementación podría ser en Python.
A los que deseen programar un fin de semana o una tarde aburrida… ya tienen un reto servido.
Actualización (29 - 03 - 08): Finalmente terminé mi propia implementación llamada bxSplit (BrunoxSplit). Pueden ver el código aquí.




