كيفية تحويل شخصية إلى 7 بت حتى التكافؤ في PHP
-
18-09-2019 - |
سؤال
أريد تحويل شخصية إلى مستوى 7 بت حتى. هل يمكن أن تقترح لي، كيف تنفذ هذا؟
المحلول
سيء للغاية لا يمكنك استخدام تعليمات X86 JPO (القفز إذا كان التكافؤ الفردي) ؛-)
اعتمادا على مقدار البيانات التي تريد التعامل معها قد تكون أسرع إذا قمت أولا بإعداد جدول ترجمة أكثر من التحقق / التعامل مع الحرف حسب الحرف.
$map = array();
for($char=0; $char<128; $char++) {
$parity = 0;
for($bit=0; $bit<8; $bit++) {
if($char & (1<<$bit)) {
$parity ^= 128;
}
}
$map[chr($char)] = chr($char|$parity);
}
(قد ترغب في اختبار هذا الرمز جيدا، لم أكن)
ثم استخدم strt () للترجمة من ASCII7 إلى ASCII7-Evenit.
$input = 'mary had a little lamb'; // all characters must be within the ascii7 range
$evenbit = strtr($input, $map);
// test output
for($i=0; $i<strlen($evenbit); $i++) {
printf("%08s\n", decbin(ord($evenbit[$i])));
}
نصائح أخرى
إليك نسخة ج:
uint8_t even_parity (uint8_t b)
{
return b ^ ((3459840 >> ((b ^ (b >> 4)) & 15)) & 128);
}
أنا متأكد من الترجمة إلى PHP ستكون سهلة، لكنني سأتجنب إحراج نفسي.
مستوحاة من هذا قليلا twiddling الاختراق.
في خطر الإصابة بالألزام:
function to7BitEven($byte) {
if( $byte > 0x7f ) return 0;
$binary = decbin($byte);
$one = 0;
$ret = 0;
for($x=0;$x<strlen($binary);$x++) {
if( $binary[$x] == '1' ) $one++;
}
if( $one % 2 != 0 ) $ret = "1";
else $ret = "0";
for($x=0;$x<(7-strlen($binary));$x++)
$ret .= "0";
$ret .= $binary;
return $ret;
}
echo to7BitEven(0x7f) . "\n";
echo to7BitEven(0x41) . "\n";
echo to7BitEven(0x3a) . "\n";
echo to7BitEven(0x3b) . "\n";
سيؤدي ذلك إلى حساب 1's، وإضافة 1 (إذا كان غريبا) أو 0 (حتى الآن) إلى البتة الأولى. ثم انسخ 7 بت 7 آخر في العودة. سيغادرك هذا بتمثيل سلسلة من 7 بت، حتى التكافؤ من البايت.
لأولئك أكثر خبرة ثم، هل هذا يبدو صحيحا؟ مثال الإخراج:
11111111
01000001
00111010
10111011