Ich untersuche Codierungen in PHP5. Gibt es eine Möglichkeit, einen rohen Hex-Dump einer Zeichenkette zu erhalten? d.h. eine hexadezimale Darstellung jedes der Bytes (nicht Zeichen) in einer Kette?Wie kann ich einen Hex-Dump eines Strings in PHP bekommen?
Antwort
echo bin2hex($string);
oder:
for ($i = 0; $i < strlen($string); $i++) {
echo str_pad(dechex(ord($string[$i])), 2, '0', STR_PAD_LEFT);
}
$string
ist die Variable, die Eingabe enthält.
Oder ein funktioneller Ansatz: print_r (array_map ('dechex', array_map ('ord', str_split ($ string)))); –
Für die Arbeit mit binären Protokolle Debuggen, ich brauchte eine traditionellere HEX-Dump, so schrieb ich diese Funktion:
function hex_dump($data, $newline="\n")
{
static $from = '';
static $to = '';
static $width = 16; # number of bytes per line
static $pad = '.'; # padding for non-visible characters
if ($from==='')
{
for ($i=0; $i<=0xFF; $i++)
{
$from .= chr($i);
$to .= ($i >= 0x20 && $i <= 0x7E) ? chr($i) : $pad;
}
}
$hex = str_split(bin2hex($data), $width*2);
$chars = str_split(strtr($data, $from, $to), $width);
$offset = 0;
foreach ($hex as $i => $line)
{
echo sprintf('%6X',$offset).' : '.implode(' ', str_split($line,2)) . ' [' . $chars[$i] . ']' . $newline;
$offset += $width;
}
}
Dies erzeugt eine traditionellere HEX dump, wie folgt aus:
hex_dump($data);
=>
0 : 05 07 00 00 00 64 65 66 61 75 6c 74 40 00 00 00 [[email protected]]
10 : 31 42 38 43 39 44 30 34 46 34 33 36 31 33 38 33 [1B8C9D04F4361383]
20 : 46 34 36 32 32 46 33 39 32 46 44 38 43 33 42 30 [F4622F392FD8C3B0]
30 : 45 34 34 43 36 34 30 33 36 33 35 37 45 35 33 39 [E44C64036357E539]
40 : 43 43 38 44 35 31 34 42 44 36 39 39 46 30 31 34 [CC8D514BD699F014]
Beachten Sie, dass nicht sichtbare Zeichen durch einen Punkt ersetzt werden. Sie können die Anzahl der Bytes pro Zeile ($ width) und das Füllzeichen ($ pad) entsprechend Ihren Anforderungen ändern. Ich habe ein Argument $ newline eingefügt, so dass Sie "<br/>"
übergeben können, wenn Sie die Ausgabe in einem Browser anzeigen müssen.
Hoffnung dies ist nützlich :-)
+1 ausgezeichnet. Zu exzellent. Ich habe vier Stunden an etwas gearbeitet und das hat mich nur noch mehr angetrieben. Wie auch immer, ich fand, dass das Echo eines Pre-Tags es in einem Browser besser anzeigt. Oder mit br newline. Ich bin neu und frage mich, wie ich die nicht sichtbaren Zeichen entschlüsseln kann. TNX. – frostymarvelous
Liebe es! Braucht paar Verbesserungen, aber als Basis für Debugging-Tool - es ist perfekt! –
@frostymarvelous für Text-nur Diagnose-Ausgabe in einem Browser, versuchen Sie 'header ('Content-Typ: Text/plain');' - ist praktisch :-) –
Während ein binäres Protokoll Debuggen brauchte ich einen hexdump (zu). Ich entschied mich, meine Lösung als PEAR-Paket zu veröffentlichen, da es definitiv nützlich ist. Sie können den Code auch bei github durchsuchen.
PEAR: http://www.metashock.de/pear
GitHub: http://www.github.com/metashock/Hexdump
Neben mindplays Lösung es Propper Wiedergabe der letzten Zeile und zusätzliche params unterstützt. Außerdem enthält das Paket eine php-ausführbare Datei namens phphd für Hexdumps auf cmdline. Dies könnte auf Windows-Systemen hilfreich sein :)
@ mindplay.dk: Danke für die Idee von strtr(). Es schien etwas schneller als mein früherer Versuch. Integriert das in meine Version. (Mit einem reduzierten Übersetzungspuffer) ..
Viel Spaß!
"Functional" Version:
$s = "\x04\x00\xa0\x00";
echo implode(' ', array_map(function($char) {
# return sprintf('%02s', $char);
return str_pad($char, 2, '0', STR_PAD_LEFT);
}, array_map('dechex', unpack('C*', $s))));
Borrowing von Ionuţ G. Stan comment, die letzte Zeile könnte wie folgt aussehen:
}, array_map('dechex', array_map('ord', str_split($s)))));
Es ist Jahre später, aber im Falle anderer suchen Auch dies erlaubte mir, den Code von mindplay.dk so zu modifizieren, dass er verschiedene Optionen akzeptiert und die Ausgabe des BSD-Befehls hexdump -C file simulierte:
und dies ist ein Hex-Dump einer kleinen Datei:
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR|
00000010 00 00 00 10 00 00 00 10 02 03 00 00 00 62 9d 17 |.............b..|
00000020 f2 00 00 00 09 50 4c 54 45 04 04 04 99 99 cc d7 |.....PLTE.......|
00000030 d7 d7 2a 66 f6 6b 00 00 00 38 49 44 41 54 78 9c |..*f.k...8IDATx.|
00000040 63 08 05 02 06 24 22 0b 44 24 01 89 ac a4 69 4b |c....$".D$....iK|
00000050 19 1a 16 68 70 31 74 29 75 2c 42 22 1a 16 75 00 |...hp1t)u,B"..u.|
00000060 c5 22 33 96 32 74 86 46 4c 65 58 19 1a 35 15 61 |."3.2t.FLeX..5.a|
00000070 00 00 df be 19 a6 2e 62 80 87 00 00 00 00 49 45 |.......b......IE|
00000080 4e 44 ae 42 60 82 |ND.B`.|
00000086
und dies ist der phpunit Test:
<?php
if (isset($argv)) {
print "Running outside of phpunit. Consider using phpunit.\n";
class PHPUnit_Framework_TestCase {}
}
class Test extends PHPUnit_Framework_TestCase
{
const FUNCTION_NAME = 'hex_dump';
const DATA_BASE64 = '
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAACVBMVEUEBASZmczX19cqZvZrAAAA
OElEQVR4nGMIBQIGJCILRCQBiaykaUsZGhZocDF0KXUsQiIaFnUAxSIzljJ0hkZMZVgZGjUVYQAA
374Zpi5igIcAAAAASUVORK5CYII=';
private $expect = array(
'00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR|',
'00000010 00 00 00 10 00 00 00 10 02 03 00 00 00 62 9d 17 |.............b..|',
'00000020 f2 00 00 00 09 50 4c 54 45 04 04 04 99 99 cc d7 |.....PLTE.......|',
'00000030 d7 d7 2a 66 f6 6b 00 00 00 38 49 44 41 54 78 9c |..*f.k...8IDATx.|',
'00000040 63 08 05 02 06 24 22 0b 44 24 01 89 ac a4 69 4b |c....$".D$....iK|',
'00000050 19 1a 16 68 70 31 74 29 75 2c 42 22 1a 16 75 00 |...hp1t)u,B"..u.|',
'00000060 c5 22 33 96 32 74 86 46 4c 65 58 19 1a 35 15 61 |."3.2t.FLeX..5.a|',
'00000070 00 00 df be 19 a6 2e 62 80 87 00 00 00 00 49 45 |.......b......IE|',
'00000080 4e 44 ae 42 60 82 |ND.B`.|',
'00000086',
);
public function testRequire() {
$file = __DIR__ . '/' . static::FUNCTION_NAME . '.php';
$this->assertFileExists($file);
include($file);
$this->assertTrue(function_exists(static::FUNCTION_NAME));
}
public function testString() {
$func = static::FUNCTION_NAME;
$data = base64_decode(static::DATA_BASE64);
if (!is_string($data)) {
throw new Exception('Unable to decode base64 encoded test data');
}
$dump = $func($data);
//var_export($dump);
$this->assertTrue(is_string($dump));
$this->assertEquals($dump, join("\n", $this->expect) . "\n");
}
}
if (isset($argv)) {
$func = Test::FUNCTION_NAME;
require_once($func . '.php');
if (count($argv) < 2) {
print "Pass arguments file, from, length.\n";
}
else {
$file = $argv[1];
if (!file_exists($file)) {
die("File not found: $file\n");
}
$from = isset($argv[2]) && preg_match('/^\d{1,9}$/', $argv[2]) ? intval($argv[2]) : null;
$len = isset($argv[3]) && preg_match('/^\d{1,9}$/', $argv[3]) ? intval($argv[3]) : filesize($file);
$h = fopen($file, 'r');
if ($from) {
fseek($h, $from);
}
$data = fread($h, $len);
fclose($h);
$dump = hex_dump($data);
print $dump;
//$dump = hex_dump($data, array('want_array' => true));
//print_r($dump);
}
}
Die letzte Zeile 00000086 ist nutzlos. –
Sagen Sie das dem Autor des BSD-Befehls hexdump. Die letzte Zeile zeigt die Dateigröße an. –
- 1. Wie kann ich einen Teilstring eines Strings in Emacs Lisp bekommen?
- 2. PHP: Wie kann ich Dateierstellungsdatum bekommen?
- 3. Wie bekomme ich die Byte-Werte eines Strings in PHP?
- 4. UWP - Wie kann ich Strings Ressourcen von Kontrollen bekommen?
- 5. Wie kann ich einen MediumDateString bekommen?
- 6. Hexdump Verwirrung
- 7. Wie kann ich eine Binärcodierung eines Strings in Python machen?
- 8. Wie kann ich einen bestimmten Teil eines Strings in Javascript ersetzen
- 9. Wie kann ich letzte Woche 'Datumsbereich in PHP bekommen?
- 10. Wie ich den Index ausgewählt bekommen kann in PHP
- 11. Wie kann ich Strings in einen HTML-Farbcode-Hash konvertieren?
- 12. Wie ändere ich die Anzahl der gedruckten Spalten in `hexdump`?
- 13. Wie kann ich bestimmte Reihen eines Tensors in TensorFlow bekommen?
- 14. Wie kann ich Benutzereingaben in Strings speichern?
- 15. Wie kann man einen Teil eines 2D-Arrays bekommen?
- 16. Wie kann ich einen CGImageRef aus einer Datei bekommen?
- 17. Wie kann ich einen Stack-Trace-Fehler in Swift bekommen?
- 18. Wie kann ich einen Ländernamen in Rails bekommen?
- 19. Wie kann ich einen java.io.InputStream von einem java.lang.String bekommen?
- 20. Wie ermittle ich den Zeichensatz eines Strings?
- 21. Kann nur einen Artikel in foreach bekommen PHP
- 22. Kann ich einen Griff bekommen - Quelle?
- 23. Wie kann ich einen Projekttyp auf Netbeans Platform bekommen?
- 24. Wie generiert man alle Permutationen eines Strings in PHP?
- 25. Wie kann ich einen Teil eines Strings nehmen und in umgekehrter alphabetischer Reihenfolge sortieren?
- 26. Wie kann ich Strings in GoLang vergleichen?
- 27. Wie kann ich einen einzigen Teil eines Hash in Perl bekommen?
- 28. Wie kann ich einen maximium Tageswert eines numerischen Feld über einem Jahr in SQL bekommen
- 29. Was ist die maximale Länge eines Strings in PHP?
- 30. Wie kann ich Faktoren eines Vektors nach Modify Strings zurücksetzen?
Einige nette kleine Online-Tool http://srsbiz.pl/utils/hexit .php und es ist php Quelle: gist.github.com/4639219 - könnte nützlich sein, credits/danke @ dev-null-dweller – hakre
https://github.com/clue/php-hexdump – bishop