it-roy-ru.com

PHP преобразовать строку в шестнадцатеричное и шестнадцатеричное в строку

У меня проблема при конвертации между этими 2 типами в PHP. Это код, который я искал в Google

function strToHex($string){
    $hex='';
    for ($i=0; $i < strlen($string); $i++){
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}


function hexToStr($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

Я проверил это и обнаружил это, когда использую XOR для шифрования.

У меня есть строка "this is the test", после XOR с ключом, у меня есть результат в строке ↕↑↔§P↔§P ♫§T↕§↕. После этого я попытался преобразовать его в hex с помощью функции strToHex (), и я получил эти 12181d15501d15500e15541215712. Затем я протестировал с функцией hexToStr () и у меня есть ↕↑↔§P↔§P♫§T↕§q. Итак, что я должен сделать, чтобы решить эту проблему? Почему это неправильно, когда я конвертирую это значение стиля 2?

34
JoeNguyen

За любой символ с ord ($ char) <16 вы получаете обратно HEX, длина которого составляет всего 1. Вы забыли добавить 0 отступов.

Это должно решить это:

<?php
function strToHex($string){
    $hex = '';
    for ($i=0; $i<strlen($string); $i++){
        $ord = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex .= substr('0'.$hexCode, -2);
    }
    return strToUpper($hex);
}
function hexToStr($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}


// Tests
header('Content-Type: text/plain');
function test($expected, $actual, $success) {
    if($expected !== $actual) {
        echo "Expected: '$expected'\n";
        echo "Actual:   '$actual'\n";
        echo "\n";
        $success = false;
    }
    return $success;
}

$success = true;
$success = test('00', strToHex(hexToStr('00')), $success);
$success = test('FF', strToHex(hexToStr('FF')), $success);
$success = test('000102FF', strToHex(hexToStr('000102FF')), $success);
$success = test('↕↑↔§P↔§P ♫§T↕§↕', hexToStr(strToHex('↕↑↔§P↔§P ♫§T↕§↕')), $success);

echo $success ? "Success" : "\nFailed";
46
boomla

PHP:

строка в гекс:

implode(unpack("H*", $string));

шестнадцатеричная строка:

pack("H*", $hex);
21
زياد

Для людей, которые попали сюда и просто ищут шестнадцатеричное представление (двоичной) строки.

bin2hex("that's all you need");
# 74686174277320616c6c20796f75206e656564

hex2bin('74686174277320616c6c20796f75206e656564');
# that's all you need
13
Philippe Gerber

Вот что я использую:

function strhex($string) {
  $hexstr = unpack('H*', $string);
  return array_shift($hexstr);
}
13
Bill Shirley
function hexToStr($hex){
    // Remove spaces if the hex string has spaces
    $hex = str_replace(' ', '', $hex);
    return hex2bin($hex);
}
// Test it 
$hex    = "53 44 43 30 30 32 30 30 30 31 37 33";
echo hexToStr($hex); // SDC002000173

/**
 * Test Hex To string with PHP UNIT
 * @param  string $value
 * @return 
 */
public function testHexToString()
{
    $string = 'SDC002000173';
    $hex    = "53 44 43 30 30 32 30 30 30 31 37 33";
    $result = hexToStr($hex);

    $this->assertEquals($result,$string);
}
1
Kamaro Lambert

Вы можете попробовать следующий код, чтобы преобразовать изображение в шестнадцатеричную строку 

<?php
$image = 'sample.bmp';
$file = fopen($image, 'r') or die("Could not open $image");
while ($file && !feof($file)){
$chunk = fread($file, 1000000); # You can affect performance altering
this number. YMMV.
# This loop will be dog-slow, almost for sure...
# You could snag two or three bytes and shift/add them,
# but at 4 bytes, you violate the 7fffffff limit of dechex...
# You could maybe write a better dechex that would accept multiple bytes
# and use substr... Maybe.
for ($byte = 0; $byte < strlen($chunk); $byte++)){
echo dechex(ord($chunk[$byte]));
}
}
?>
0
bhargav venkatesh

У меня есть только половина ответа, но я надеюсь, что это полезно, так как добавляет поддержку Unicode (UTF-8)

//decimal to unicode character
function unichr($dec) { 
  if ($dec < 128) { 
    $utf = chr($dec); 
  } else if ($dec < 2048) { 
    $utf = chr(192 + (($dec - ($dec % 64)) / 64)); 
    $utf .= chr(128 + ($dec % 64)); 
  } else { 
    $utf = chr(224 + (($dec - ($dec % 4096)) / 4096)); 
    $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64)); 
    $utf .= chr(128 + ($dec % 64)); 
  } 
  return $utf;
}

Нанизывать

var_dump(unichr(hexdec('e641')));

Источник: http://www.php.net/manual/en/function.chr.php#Hcom55978

0
Timo Huovinen

Используя ответ @ bill-shirley с небольшим дополнением

function str_to_hex($string) {
$hexstr = unpack('H*', $string);
return array_shift($hexstr);
}
function hex_to_str($string) {
return hex2bin("$string");
}

Использование:

  $str = "Go placidly amidst the noise";
  $hexstr = str_to_hex($str);// 476f20706c616369646c7920616d6964737420746865206e6f697365
  $strstr = hex_to_str($str);// Go placidly amidst the noise
0
PeterT