在php中将ascii转换为十六进制

3

我想在PHP中将ASCII转换为十六进制,但是得到的结果与一些在线工具不同。虽然我知道自己需要的结果,但是这个在线工具的结果看起来是正确的,我的代码却不正确,但我无法弄清原因。

String:         2Ffbj?DoyXOU
Correct output: 32 46 66 62 6a 3f 44 6f 79 58 4f 55 (from linked site above)
My output:      32 46 66 62 6a 3f 44 6f 79 58 4f 75

我的脚本:

echo bin2hex(utf8_decode("2Ffbj?DoyXOU"));

故障出在哪里?
3个回答

11

使用那个:

function ascii2hex($ascii) {
  $hex = '';
  for ($i = 0; $i < strlen($ascii); $i++) {
    $byte = strtoupper(dechex(ord($ascii{$i})));
    $byte = str_repeat('0', 2 - strlen($byte)).$byte;
    $hex.=$byte." ";
  }
  return $hex;
}
结果为:

ascii to hex


2
你能解释一下为什么OP的方法没有返回正确的结果吗? - Gottlieb Notschnabel
1
我只是好奇为什么这个算法可以工作,而 bin2hex() 却不能返回正确的结果。 - Gottlieb Notschnabel
@GottliebNotschnabel 之所以不起作用,是因为bin2hex(和)hex2bin不完全符合您的期望。在这种情况下,php中的Bin是一个由0和1组成的字符串,例如:“010110101”,而不是二进制数据。 - Kladskull

1

试试这个:

function ascii2hex($arg){
   return implode(" ",array_map(fn($x) => sprintf("%02s",strtoupper(dechex(ord($x)))),str_split($arg)));
}

0
感谢Patrick Maciel提供的好答案。 如果您使用PHP 7.4,则可能会出现错误消息“不再支持使用大括号进行数组和字符串偏移访问语法”。使用“ [ ”和“ ] ”替换“ { ”和“ } ”可以解决这个问题。
参考: 弃用了花括号的数组和字符串偏移访问语法

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接