处理二进制数据和mb_function重载?

时间:2017-11-09 17:00:32

标签: php binary-data multibyte-functions

我在这里有一段代码,我需要保证,或者"不不不!"关于我是否以正确或完全错误的方式思考这个问题。

这必须处理在特定位置切割二进制数据的变量,以及处理多字节重载函数。例如,substr实际为mb_substrstrlenmb_strlen等。

我们的服务器设置为UTF-8内部编码,所以这是我为避免这种二进制数据操作而做的奇怪小事:

// $binary_data is the incoming variable with binary
// $clip_size is generally 16, 32 or 64 etc
$curenc = mb_internal_encoding();// this should be "UTF-8"
mb_internal_encoding('ISO-8859-1');// change so mb_ overloading doesnt screw this up
if (strlen($binary_data) >= $clip_size) {
    $first_hunk = substr($binary_data,0,$clip_size);
    $rest_of_it = substr($binary_data,$clip_size);
} else {
    // skip since its shorter than expected
}
mb_internal_encoding($curenc);// put this back now

由于其二进制数据,我无法真正显示输入和输出结果。但是使用上述测试似乎工作正常,没有任何事情发生......

然而,我的大脑部分都在尖叫着#34;你在做什么......这不是解决这个问题的方法"!

注意:

  • 进入的二进制数据是这两个部分的串联开始。
  • 第一部分的大小始终是已知的(但更改)。
  • 第二部分的大小完全不为人知。
  • 这非常接近加密,并在前面填充IV并再次将其剥离(奇怪的是,我发现了一些旧代码,它也会做同样的事情)。

所以,我想我的问题是:

  • 这样做真的很好吗?
  • 或者是否有一些非常明显的东西我可以俯视?

2 个答案:

答案 0 :(得分:1)

  

然而,我的大脑部分都在尖叫着#34;你在做什么......这不是解决这个问题的方法"!

你的大脑是对的,你不应该在PHP中做到这一点。 :)

  

这样做真的很好吗?

这取决于您的代码的目的。

我无法看到任何理由让我能够像这样切割二进制文件。所以我的第一直觉就是"不不不!"使用unpack()将二进制文件正确解析为可用变量。

如果您只是因为原因需要拆分二进制文件,那么我想这很好。只要您的测试确认代码适合您,我就不会发现任何问题。

作为旁注,我并没有完全针对这种用例使用mbstring重载 - 即只要你需要默认的字符串函数。

答案 1 :(得分:0)

我对可怕的解决方案

我不喜欢回答我自己的问题......但我想分享我已经决定的内容。

虽然我拥有的是"工作",我仍然想改变charset编码的黑客作业改变。这是我承认的旧代码,但出于某种原因,我从未考虑hex2bin bin2hex这样做。所以我决定改变它以使用它们。

生成的新代码:

// $clip_size remains the same value for continuity later, 
// only spot-adjusted here... which is why the *2.
   $hex_data   = bin2hex( $binary_data );
   $first_hunk = hex2bin( substr($hex_data,0,($clip_size*2)) );
   $rest_of_it = hex2bin( substr($hex_data,($clip_size*2)) );
   if ( !empty($rest_of_it) ) { /* process the result for reasons */ }

使用十六进制函数,将乱七八糟的东西变成mb不会用任何一种方式搞定。一个100万个工作台循环,表明这个过程并不值得担心(与mb_encoding mangle方法并行运行更安全)。

所以我要这样做。它在我的脑海中更好地存在,并且暂时解决了我的问题......直到我在几年内再次访问这个旧代码然后去了#34;我在想什么?!"。

相关问题