dec - string to binary php
PHP convierte cadena en hexadecimal y hexadecimal en cadena (7)
Tengo el problema al convertir entre este tipo 2 en PHP. Este es el código que busqué en 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;
}
Lo verifiqué y descubrí esto cuando uso XOR para cifrar.
Tengo la cadena "this is the test"
, después de XOR con una tecla, tengo el resultado en la cadena ↕↑↔§P↔§P ♫§T↕§↕
. Después de eso, intenté convertirlo en hexadecimal mediante la función strToHex () y obtuve estos 12181d15501d15500e15541215712
. Luego, probé con la función hexToStr () y tengo ↕↑↔§P↔§P♫§T↕§q
. Entonces, ¿qué debo hacer para resolver este problema? ¿Por qué está mal cuando convierto este valor de 2 estilos?
Esto es lo que yo uso:
function strhex($string) {
$hexstr = unpack(''H*'', $string);
return array_shift($hexstr);
}
PHP:
cadena a hexadecimal
implode(unpack("H*", $string));
hexadecimal a la cuerda:
pack("H*", $hex);
Para cualquier char con ord ($ char) <16, obtienes un HEX de vuelta que solo dura 1. Se te olvidó agregar 0 rellenos.
Esto debería resolverlo:
<?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";
Para las personas que terminan aquí y solo están buscando la representación hexadecimal de una cadena (binaria).
bin2hex("that''s all you need");
# 74686174277320616c6c20796f75206e656564
hex2bin(''74686174277320616c6c20796f75206e656564'');
# that''s all you need
Solo tengo la mitad de la respuesta, pero espero que sea útil ya que agrega soporte para 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;
}
Encadenar
var_dump(unichr(hexdec(''e641'')));
Fuente: http://www.php.net/manual/en/function.chr.php#Hcom55978
Usando la respuesta de @ bill-shirley con una pequeña adición.
function str_to_hex($string) {
$hexstr = unpack(''H*'', $string);
return array_shift($hexstr);
}
function hex_to_str($string) {
return hex2bin("$string");
}
Uso:
$str = "Go placidly amidst the noise";
$hexstr = str_to_hex($str);// 476f20706c616369646c7920616d6964737420746865206e6f697365
$strstr = hex_to_str($str);// Go placidly amidst the noise
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);
}