我在这里有一段代码,我需要保证,或者"不不不!"关于我是否以正确或完全错误的方式思考这个问题。
这必须处理在特定位置切割二进制数据的变量,以及处理多字节重载函数。例如,substr
实际为mb_substr
,strlen
为mb_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;你在做什么......这不是解决这个问题的方法"!
注意:
所以,我想我的问题是:
答案 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;我在想什么?!"。