Php 处理二进制数据和mb_函数重载?

Php 处理二进制数据和mb_函数重载?,php,binary-data,multibyte-functions,Php,Binary Data,Multibyte Functions,我这里有一段代码,我需要保证,或者“不,不,不”,关于我是以正确的方式思考这个问题,还是完全错误的方式思考这个问题 这必须处理在特定位置剪切二进制数据变量,以及处理多字节重载函数。例如substr实际上是mb_substr和strlen是mb_strlen等 我们的服务器设置为UTF-8internal encoding,因此我做了一件奇怪的小事情来绕过它进行二进制数据操作: // $binary_data is the incoming variable with binary // $cli

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

这必须处理在特定位置剪切二进制数据变量,以及处理多字节重载函数。例如
substr
实际上是
mb_substr
strlen
mb_strlen

我们的服务器设置为
UTF-8
internal encoding,因此我做了一件奇怪的小事情来绕过它进行二进制数据操作:

// $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在前面,并撕掉它再次(奇怪的是,我发现了一些老代码,做同样的事情哈哈)
所以,我想我的问题是:

  • 这样做真的好吗
  • 还是有什么特别明显的东西我忽略了
然而,我的部分大脑在尖叫“你在干什么……这不可能是处理这个问题的方法”

你的大脑是对的,首先你不应该在PHP中这样做

这样做真的好吗

这取决于代码的用途

我看不出我有什么理由去剪那样的二进制文件。因此,我的第一反应是“不,不,不!”用于正确地将二进制解析为可用变量

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


作为一个补充说明,我并不完全在这种用例中使用mbstring重载,也就是说,在您需要默认字符串函数时使用mbstring重载。

我的解决方案

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

虽然我所做的“有效”,但我仍然想改变改变字符集编码的黑客工作。我承认这是旧代码,但出于某种原因,我从来没有考虑过使用
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 */ }
使用hex函数,将混乱变成mb无法用任何方式处理的东西。一个100万台的循环表明,这个过程没有什么可担心的(与mb_编码的mangle方法相比,并行运行更安全)


所以我要用这个。它在我脑海中的位置更好,现在解决了我的问题。。。直到几年后我再次访问这段旧代码并问“我在想什么?!”

您是否试图将二进制解析为变量,以便在代码中使用它们?$first\u hunk和$rest\u的最终目的是什么?最终目的有点模糊,我不想深入探讨;)。。。但我可以说,第一个和第二个变量应该包含原始二进制数据的两部分(在剪辑长度处剪切)(考虑到古怪的方法,它确实可以)。对。最初导致这种混乱的是多字节重载。这就是为什么我要做这种转换。我正在研究一些位运算符,但我必须承认,二进制操作不是我的长处之一。像shift这样的位运算符不起作用,因为它们将操作数视为整数。