我得到一个输入字符串,其中包含一些base64编码的数据。不幸的是,它将随机十六进制数据(全部小写)混合在一起。手动整理是相当简单的,因为十六进制数据似乎都是32字节的段。例如,我可以格式化一个像这样的示例字符串:
6dd11d15c419ac219901f14bdd999f38 0ad94e978ad624d15189f5230e5435a9 2dc19fe95e583e7d593dd52ae7e68a6e 465ffa6074a371a8958dad3ad271181a 23310939b981b4e56f2ecee26f82ec60 fe04bef49be47603d1278cc80673b226 VGhpcyBpcyBzb 6dd11d15c419ac219901f14bdd999f38 0ad94e978ad624d15189f5230e5435a9 2dc19fe95e583e7d593dd52ae7e68a6e 465ffa6074a371a8958dad3ad271181a 23310939b981b4e56f2ecee26f82ec60 fe04bef49be47603d1278cc80673b226 6dd11d15c419ac219901f14bdd999f38 0ad94e978ad624d15189f5230e5435a9 2dc19fe95e583e7d593dd52ae7e68a6e 465ffa6074a371a8958dad3ad271181a 23310939b981b4e56f2ecee26f82ec60 fe04bef49be47603d1278cc80673b226 21lIGJhc2UtNjQ bb4af7e61760735ba17c29e8f542a668 75da91e90863f1ddb7e149297fc59afc f5de951fb65d06d2927aab7b9b54830e 2d935616a54c381c2f38db3731d5a378 gZW5jb2RlZCB 6dd11d15c419ac219901f14bdd999f38 0ad94e978ad624d15189f5230e5435a9 2dc19fe95e583e7d593dd52ae7e68a6e 465ffa6074a371a8958dad3ad271181a 23310939b981b4e56f2ecee26f82ec60 fe04bef49be47603d1278cc80673b226 kYXRhIGhvb3JheSE=
基本上,我需要输出base64东西并解码它(在PHP中)。问题是,我把它全部作为一个长字符串,而且并不总是立即显而易见的放置换行符。例如,base64内容的第一位以'b'结尾,很容易被误认为是某些十六进制数据。我对如何做到这一点感到有些失落...有什么想法吗?
谢谢!
-mala
答案 0 :(得分:5)
我认为这是一个无法解决的问题 - 完全有可能拥有32个字节的base64编码数据,这些数据无法与32个字节的随机十六进制区分开来。如果没有关于流的更多信息,就不可能决定这样的数据可能会去哪个桶。
答案 1 :(得分:2)
你可以这样做:
read these 32 characters - if( preg_match(/[^a-f0-9]/) ) {
echo "this is a hex string";
} else {
$base64[] = preg_replace('/[a-f0-9]$/', '');
}
当然,有一个尾随a-z / 0-9的问题,但这是一个起点。 您可以添加一些代码,其中从可疑base64的末尾开始计数到下一个[g-zA-Z]的开头,并查看该字符数是否可以被32整除。如果是,则可能找到所有你原来的base64。如果没有,如果'b'是b64的结尾或十六进制的开头,你将不知道,6是十六进制的结尾,或者你的NEXT b64的开头。
简而言之,这是愚蠢的,这让我感到难过。
答案 2 :(得分:0)
有可能base64解码到每个决策点(接下来的32个字节base64或hex)可能带有线索。
还有最简单的机会解释其中一个十六进制字符串,因为base64 始终会为正在解码的内容产生容易检测到的垃圾。
否则你运气不好。