【问题标题】:PHP encoding problem: how to encode base64 encoded uint8 bytes to hexPHP编码问题:如何将base64编码的uint8字节编码为十六进制
【发布时间】:2019-11-12 23:33:17
【问题描述】:

我的问题是,我前段时间用 C 语言(作为 uint8_t)对来自 openssl sha256 的随机字节进行 base64 编码,将它们输入 shell 脚本并使用输出。 我现在可以从我的数据中重建的是:


file.txt 的内容: uvjWEHTUk1LnzVZul9ynRpezWfKYN3bvlx103wxACxo

test@test:~# base64 -d file.txt | od -t x1 0000000 ba f8 d6 10 74 d4 93 52 e7 cd 56 6e 97 dc a7 46 0000020 97 b3 59 f2 98 37 76 ef 97 1d 74 df 0c 40 0b 1a

输出与PHP中调用相同:

echo bin2hex(base64_decode("uvjWEHTUk1LnzVZul9ynRpezWfKYN3bvlx103wxACxo=")); baf8d61074d49352e7cd566e97dca74697b359f2983776ef971d74df0c400b1a


我一直在 shell 中做的,现在在 PHP 中需要做的事情如下:

同样,file.txt 的内容相同: uvjWEHTUk1LnzVZul9ynRpezWfKYN3bvlx103wxACxo

test@test:~# base64 -d file.txt | od -t x8 0000000 5293d47410d6f8ba 46a7dc976e56cde7 0000020 ef763798f259b397 1a0b400cdf741d97

我的问题是:现在 PHP 中的相等过程是什么(在 shell 中为 od -t x8)? 我试过 pack / unpack / bin2hex / ... 并不能得到相同的结果。

我正在尝试获取包含以下内容的字符串: “5293d47410d6f8ba46a7dc976e56cde7ef763798f259b3971a0b400cdf741d97”

base64_decode("uvjWEHTUk1LnzVZul9ynRpezWfKYN3bvlx103wxACxo=") 的起点开始。有什么想法吗?

【问题讨论】:

  • echo bin2hex(base64_decode($x)) 的反面不是base64_encode(hex2bin($x))吗?
  • @miken32 完全正确,但是 base64_encode(hex2bin("5293d47410d6f8ba46a7dc976e56cde7ef763798f259b3971a0b400cdf741d97"));不是我需要/寻找的 (uvjWEHTUk1LnzVZul9ynRpezWfKYN3bvlx103wxACxo)
  • 你知道x8是8个字节而不是8位吗?你真的需要x8 而不是x1
  • @zerkms 是的,现在我知道最初的假设是错误的,但现在为时已晚。需要 x8...

标签: php shell base64 bin2hex od


【解决方案1】:

如果x8是你真正需要的,8字节,那么实现就这么简单

<?php

$str = 'uvjWEHTUk1LnzVZul9ynRpezWfKYN3bvlx103wxACxo';
$bin = base64_decode($str);

if (strlen($bin) % 8 !== 0) {
    throw new \RuntimeException('data length should be divisible by 8');
}

$result = '';

for ($i = 0; $i < strlen($bin); $i += 8) {
    for ($j = $i + 7; $j >= $i; --$j) {
        $result .= bin2hex($bin[$j]);
    }
}

echo $result;

它遍历 8 个字节的块,然后以相反的顺序转储它们。

Ideone:https://ideone.com/hBanqi

【讨论】:

  • 非常感谢您解决这个问题,它有效!正如您所评论的,x8 是错误的选择,但由于数据已经这样记录,您的答案有效。
猜你喜欢
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2013-09-25
  • 2020-03-04
相关资源
最近更新 更多