2009-06-29 17 views
55

मैं PHP5 में एन्कोडिंग की जांच कर रहा हूं। क्या स्ट्रिंग के कच्चे हेक्स डंप को पाने का कोई तरीका है? यानी एक स्ट्रिंग में प्रत्येक बाइट्स (अक्षर नहीं) का हेक्स प्रतिनिधित्व?मैं PHP में एक स्ट्रिंग का हेक्स डंप कैसे प्राप्त कर सकता हूं?

+1

कुछ अच्छी छोटी ऑनलाइन उपकरण http://srsbiz.pl/utils/hexit .php और इसका php स्रोत: gist.github।कॉम/463921 9 - उपयोगी हो सकता है, क्रेडिट/धन्यवाद @ dev-null-dweller – hakre

+0

https://github.com/clue/php-hexdump – bishop

उत्तर

80
echo bin2hex($string); 

या:

for ($i = 0; $i < strlen($string); $i++) { 
    echo str_pad(dechex(ord($string[$i])), 2, '0', STR_PAD_LEFT); 
} 

$string चर जो इनपुट होता है।

+12

या अधिक कार्यात्मक दृष्टिकोण: print_r (array_map ('dechex', array_map ('ord', str_split ($ string)))); –

66

द्विआधारी प्रोटोकॉल के साथ काम डिबगिंग के लिए, मैं एक और अधिक परंपरागत हेक्स डंप की जरूरत है, तो मैं इस समारोह ने लिखा है:

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; 
    } 
} 

यह इस तरह, एक और अधिक परंपरागत हेक्स डंप का उत्पादन:

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] 

ध्यान दें कि गैर-दृश्यमान वर्णों को एक अवधि के साथ प्रतिस्थापित किया जाता है - आप अपनी आवश्यकताओं के अनुरूप प्रति पंक्ति ($ चौड़ाई) और पैडिंग वर्ण ($ पैड) की बाइट्स की संख्या बदल सकते हैं। मैंने एक $ न्यूलाइन तर्क शामिल किया है, इसलिए यदि आप ब्राउज़र में आउटपुट प्रदर्शित करने की आवश्यकता है तो आप "<br/>" पास कर सकते हैं।

आशा यह है उपयोगी :-)

+2

+1 उत्कृष्ट। बहुत बढ़िया मैं कुछ घंटों + काम कर रहा हूं और इससे मुझे बढ़ावा मिला। वैसे भी, मैंने पाया कि एक पूर्व टैग को प्रतिबिंबित करने से यह ब्राउज़र में बेहतर प्रदर्शन करता है। या ब्र नईलाइन का उपयोग कर। मैं इस पर नया हूं और आश्चर्य करता हूं कि मैं दृश्यमान वर्णों को कैसे डिक्रिप्ट कर सकता हूं। TNX। – frostymarvelous

+0

इसे प्यार करो! जोड़े सुधारों की आवश्यकता है, लेकिन डिबगिंग टूल के आधार के रूप में - यह एकदम सही है! –

+2

ब्राउज़र में केवल टेक्स्ट-डायग्नोस्टिक आउटपुट के लिए @frostymarvelous, 'हेडर (' सामग्री-प्रकार: टेक्स्ट/सादा ') आज़माएं; '- काम में आता है :-) –

3

) एक द्विआधारी प्रोटोकॉल डिबगिंग जबकि भी मैं एक hexdump जरूरत (। मैंने अपने समाधान को एक पीईएआर पैकेज के रूप में प्रकाशित करने का फैसला किया क्योंकि यह निश्चित रूप से उपयोगी है। आप github पर कोड भी ब्राउज़ कर सकते हैं।

नाशपाती: http://www.metashock.de/pear

GitHub: http://www.github.com/metashock/Hexdump

mindplays समाधान के अलावा यह अंतिम पंक्ति और अतिरिक्त पैरामीटर की उचित प्रतिपादन का समर्थन करता है। इसके अलावा पैकेज में एक php निष्पादन योग्य नाम है जिसे cmdline पर हेक्सडंप के लिए phphd नाम दिया गया है। यह विंडोज सिस्टम पर उपयोगी हो सकता है :)

@ mindplay.dk: strtr() विचार के लिए धन्यवाद। यह मेरे पूर्व प्रयास से थोड़ा तेज दिखाई दिया। मेरे संस्करण में एकीकृत है। (एक कम अनुवाद बफर का उपयोग कर) ..

मज़ा लें!

1

"कार्यात्मक" संस्करण:

$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)))); 

Ionuţ जी स्टेन का comment से उधार, अंतिम पंक्ति के रूप हो सकता है इस प्रकार है:

}, array_map('dechex', array_map('ord', str_split($s))))); 
4

यह साल बाद, लेकिन मामले दूसरों में है की तलाश कर रहे यह भी, मैंने विभिन्न विकल्पों को स्वीकार करने और बीएसडी कमांड हेक्सडम्प-सी फ़ाइल के आउटपुट को अनुकरण करने के लिए mindplay.dk के कोड को संशोधित करने की स्वतंत्रता ली:

/** 
* Dumps a string into a traditional hex dump for programmers, 
* in a format similar to the output of the BSD command hexdump -C file. 
* The default result is a string. 
* Supported options: 
* <pre> 
* line_sep  - line seperator char, default = "\n" 
* bytes_per_line - default = 16 
* pad_char  - character to replace non-readble characters with, default = '.' 
* </pre> 
* 
* @param string $string 
* @param array $options 
* @param string|array 
*/ 
function hex_dump($string, array $options = null) { 
    if (!is_scalar($string)) { 
     throw new InvalidArgumentException('$string argument must be a string'); 
    } 
    if (!is_array($options)) { 
     $options = array(); 
    } 
    $line_sep  = isset($options['line_sep']) ? $options['line_sep']   : "\n"; 
    $bytes_per_line = @$options['bytes_per_line'] ? $options['bytes_per_line'] : 16; 
    $pad_char  = isset($options['pad_char']) ? $options['pad_char']   : '.'; # padding for non-readable characters 

    $text_lines = str_split($string, $bytes_per_line); 
    $hex_lines = str_split(bin2hex($string), $bytes_per_line * 2); 

    $offset = 0; 
    $output = array(); 
    $bytes_per_line_div_2 = (int)($bytes_per_line/2); 
    foreach ($hex_lines as $i => $hex_line) { 
     $text_line = $text_lines[$i]; 
     $output []= 
      sprintf('%08X',$offset) . ' ' . 
      str_pad(
       strlen($text_line) > $bytes_per_line_div_2 
       ? 
        implode(' ', str_split(substr($hex_line,0,$bytes_per_line),2)) . ' ' . 
        implode(' ', str_split(substr($hex_line,$bytes_per_line),2)) 
       : 
       implode(' ', str_split($hex_line,2)) 
      , $bytes_per_line * 3) . 
      ' |' . preg_replace('/[^\x20-\x7E]/', $pad_char, $text_line) . '|'; 
     $offset += $bytes_per_line; 
    } 
    $output []= sprintf('%08X', strlen($string)); 
    return @$options['want_array'] ? $output : join($line_sep, $output) . $line_sep; 
} 

और इस एक छोटे से फ़ाइल की एक हेक्स डंप है:

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 

और इस PHPUnit परीक्षण है:

<?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); 
    } 
} 
+0

अंतिम पंक्ति 00000086 बेकार है। –

+3

बीएसडी कमांड हेक्सडम्प के लेखक को बताएं। अंतिम पंक्ति फ़ाइल आकार इंगित करती है। –

संबंधित मुद्दे

 संबंधित मुद्दे