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在前面,并撕掉它再次(奇怪的是,我发现了一些老代码,做同样的事情哈哈)
- 这样做真的好吗
- 还是有什么特别明显的东西我忽略了
作为一个补充说明,我并不完全在这种用例中使用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这样的位运算符不起作用,因为它们将操作数视为整数。