2017-09-30 3 views
0

pour vérifier la taille du fichier dans le système 2. J'ai créé le code comme coup dans élixirBash md5 ne définit pas par Elixir md5 créateur

def file_md5_creator do 
    filepath = "/Users/shahryar/Desktop/test.jpg"  
    File.stream!(filepath) |> 
    Enum.reduce(:crypto.hash_init(:md5), 
    fn(line, acc) -> :crypto.hash_update(acc,line) end) |> 
    :crypto.hash_final |> Base.encode16(case: :lower) 
end 

mais Bash md5 ne définit pas par élixir md5 créateur

élixir md5: ee4ed0f9c357b7d803d08f7d75dd983b

bash: 53a3107b118854f20c5af6269a434981

commande bash =

md5 /Users/shahryar/Desktop/test.jpg 

Mon os: mac

Moyens me aider pour le problème

+0

sortie de votre code correspond à la sortie de 'utilitaire md5' de ligne de commande pour moi quand je teste contre un fichier aléatoire jpg. Pouvez-vous télécharger votre fichier quelque part? – Dogbert

+0

@Dogbert, tout mon code a été écrit dans le premier message. je n'avais pas de fichiers. –

+0

Ce fichier: '/ Users/shahryar/Desktop/test.jpg'. – Dogbert

Répondre

1

File.stream! par défaut à la lecture des fichiers en mode "ligne" qui normalise la séquence "\r\n" de retour à la ligne "\n".

iex(1)> File.write!("a", "a\r\nb\r\nc") 
:ok 
iex(2)> File.read!("a") 
"a\r\nb\r\nc" 
iex(3)> File.stream!("a") |> Enum.into("") 
"a\nb\nc" 

Pour faire File.stream! pas cela, vous pouvez le faire lire en mode octets, en spécifiant un entier comme troisième argument, qui est le nombre d'octets à lire à la fois.

iex(4)> File.stream!("a", [], 16384) |> Enum.into("") 
"a\r\nb\r\nc" 

Votre image contient "\r\n" en plusieurs endroits qui signifie que les données brutes sont corrompues par File.stream! et vous obtenez la mauvaise valeur de hachage MD5. Si vous changez votre troisième argument de l'appel File.stream! à un entier, il devrait fonctionner correctement:

File.stream!(filepath, [], 16384) |> 
+0

Merci. Ça marche. –