0

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

这必须处理在特定位置切割二进制数据变量,还必须处理多字节重载函数。例如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

我不能真正显示输入和输出结果,因为它是二进制数据。但是使用上述方法的测试似乎工作得很好,没有任何问题......

然而,我的部分大脑在尖叫“你在做什么……这不是处理这个问题的方法”!

笔记:

  • 进来的二进制数据是这两个部分的串联。
  • 第一部分的大小始终是已知的(但会发生变化)。
  • 第二部分的大小完全未知。
  • 这非常接近于加密并将IV填充在前面并再次将其撕掉(奇怪的是,我发现了一些做同样事情的旧代码哈哈)。

所以,我想我的问题是:

  • 这真的很好吗?
  • 还是我忽略了一些非常明显的东西?
4

2 回答 2

1

然而,我的部分大脑在尖叫“你在做什么……这不是处理这个问题的方法”!

你的大脑是对的,你一开始就不应该在 PHP 中这样做。:)

这真的很好吗?

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

我看不出有什么理由要削减这样的二进制文件。所以我的第一反应是“不不不!” 使用unpack()将二进制文件正确解析为可用变量。

话虽这么说,如果您只是因为某些原因需要拆分二进制文件,那么我想这很好。只要您的测试确认代码对您有效,我看不出有任何问题。

附带说明一下,我不会将 mbstring 重载完全用于这种用例 - 即,只要您需要默认字符串函数。

于 2017-11-09T18:02:34.487 回答
0

我的解决方案

我不喜欢回答自己的问题……但我还是想分享我的决定。

尽管我所拥有的“工作”,但我仍然想更改字符集编码的 hack-job-altering。我承认这是旧代码,但出于某种原因,我从未考虑过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 方法相比,它与自身并行运行更安全)。

所以我要这样做。它在我的脑海中更好,并且暂时解决了我的问题......直到几年后我再次重新审视这段旧代码并去“我在想什么?!”。

于 2017-11-13T16:18:25.247 回答