Wie berechne crc32-Prüfsumme von string auf linux bash
Ich verwendet crc32 zu berechnen checkcums von sting vor langer Zeit, aber ich kann mich nicht erinnern wie ich es gemacht habe.
echo -n "LongString" | crc32 # no output
Ich eine Lösung gefunden [1] zu berechnen, mit Python, aber ist es nicht ein direkter Weg zur Berechnung von string?
# signed
python -c 'import binascii; print binascii.crc32("LongString")'
python -c 'import zlib; print zlib.crc32("LongString")'
# unsigned
python -c 'import binascii; print binascii.crc32("LongString") % (1<<32)'
python -c 'import zlib; print zlib.crc32("LongString") % (1<<32)'
[1] Wie berechne CRC32 mit Python-match online Ergebnisse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kam ich gegen dieses problem selbst und ich wollte nicht gehen, um den "Streit" zu installieren
crc32
. Ich kam mit dieser, und obwohl es ein wenig böse, es sollte auf den meisten Plattformen oder die meisten modernen linux sowieso ...Nur um einige technische details, gzip verwendet crc32 in den letzten 8 bytes und die
-c
option bewirkt die Ausgabe auf die Standardausgabe undtail
Streifen aus den letzten 8 bytes.hexdump
war ein wenig kniffliger und ich musste futz etwa mit ihm für eine Weile, bevor ich kam mit etwas befriedigendes, aber das format scheint hier richtig analysiert, die gzip-crc32 als ein einzelnes 32-bit-Zahl:-n4
nimmt nur die relevanten ersten 4 bytes der gzip Fußzeile.'"%u"'
ist Ihre standard fprintf format-string formatiert werden die bytes als ein einzelner vorzeichenloser 32-bit-Ganzzahl. Beachten Sie, dass Anführungszeichen geschachtelten in einfache Anführungszeichen (hier.Wenn Sie möchten, eine hexadezimale Prüfsumme können Sie ändern Sie den format-string zu
'"%08x"'
(oder'"%08X"'
für Großbuchstaben hex) welches format wird die Prüfsumme als 8 Zeichen (0 gepolsterten) hexadezimal.Wie gesagt, nicht die eleganteste Lösung, und vielleicht nicht ein Ansatz, den Sie benutzen wollen würde in einer performance-sensitiven Szenario aber ein Ansatz sein Appell, angesichts der nahezu Universalität der Befehle verwendet.
Der schwache Punkt hier für cross-Plattform-usability ist wahrscheinlich die
hexdump
Konfiguration, da ich gesehen habe, variiert es von Plattform zu Plattform und es ist ein bisschen fummelig. Ich würde vorschlagen, wenn Sie dieses sollten Sie versuchen, einige test-Werte und vergleichen Sie mit der Ergebnisse einer online-tool.BEARBEITEN Wie vorgeschlagen von @PedroGimeno in den Kommentaren, können Sie leiten Sie die Ausgabe in
od
statthexdump
für identische Ergebnisse ohne fummelig Optionen.... | od -t x4 -N 4 -A n
für hex -... | od -t d4 -N 4 -A n
für dezimal.... | od -t x4 -N 4 -A n
-t x4
für hexadezimale Ausgabe und-t d4
für dezimal.Oder benutzen Sie einfach das Prozess-substitution:
crc32 <(pv /some/file)
Super geklappt.Unter Ubuntu, zumindest
/usr/bin/crc32
ist ein kurzes Perl-Skript, und Sie können ganz genau sehen, aus seiner Quelle, dass alle es tun können, ist offen-Dateien. Es hat keine Möglichkeit, von stdin Lesen -- es muss nicht eine Besondere Behandlung für-
als einen Dateinamen oder eine-c
parameter oder ähnliches.Also der einfachste Ansatz ist, mit ihm zu Leben, und stellen Sie eine temporäre Datei.
Wenn Sie wirklich nicht wollen, um eine Datei schreiben (z.B. ist es mehr Daten, als Sie in Ihrem Dateisystem können nehmen-unwahrscheinlich, wenn es wirklich einen "long string", aber für die Zwecke für das argument...) könnte man eine named pipe. Um eine einfache, nicht-random-access-reader dies ist zu unterscheiden von einer Datei:
Hinweis: die
&
hintergrund-Prozess, der die schreibtfifo
, denn es wird blockiert, bis der nächste Befehl gelesen.Werden mehr wählerisch über die Erstellung temporärer Dateien finden Sie unter: https://unix.stackexchange.com/questions/181937/how-create-a-temporary-file-in-shell-script
Alternativ verwenden Sie, was ist im Skript so ein Beispiel, von dem schreiben Sie Ihre eigene Perl-one-liner (die Anwesenheit von
crc32
auf Ihrem system zeigt an, dass Perl und das Modul installiert sind), oder verwenden Sie die Python one-liner, die Sie bereits gefunden habe.Deine Frage hat bereits die meisten Antworten.
richtig gibt
3421780262
Ich bevorzuge hex:
Bewusst sein, dass es mehrere CRC-32-algorithmen:
http://reveng.sourceforge.net/crc-catalogue/all.htm#crc.cat-bits.32
poly=0x04c11db7
undrefin=true
tun. CRC-32/ISO-HDLC aufgeführt, es ist die PKZIP-CRC.poly=0x04c11db7
bedeuten beschäftigenedb88320
? Ich denke, es hat etwas zu tun mit derrefin=true
? Ehrliche Frage, ich war auf der Suche für Definitionen erforderlich, um die Anpassung an die Prüfsummen-routine und widersprüchliche (mir) Informationen. Schließlich landeten mitedb88320
mit der Start-Samenffffffff
und Letzteffffffff
EOR Ergebnisse zu erhalten, kompatibel mit dem, was die genanntencrc32
- Skript.0x04c11db7
.refin=true
bedeutet, dass die input-bits widerspiegeln. In der Praxis, das ist nie geschehen, da würden Sie haben, um es zu tun jedes input-byte. Anstelle der Polynom spiegelt sich, einmal.Hier ist ein reines Bash-Implementierung:
Testen: