0

ヘキサ・ド・バイナリを転送するプログラムを実行しようとしています。問題は、A、B、C、..、F を 10,11,12,...,15 に変更することにあるので、数字と同じように扱うことができます。私はこの機能を作りました:

function odstran_pismena($pole)
{
    $dlzka = count($pole);
    for ($i = 0; $i< $dlzka; $i++)
        switch ($pole[$i])
            {
                case 0: break;
                case 1: break;
                case 2: break;
                case 3: break;
                case 4: break;
                case 5: break;
                case 6: break;
                case 7: break;
                case 8: break;
                case 9: break;
                case ("A" || "a"): $pole[$i] = 10;
                                break;
                case ("B" || "b"): $pole[$i] = 11;
                                break;
                case ("C" || "c"): $pole[$i] = 12;
                                break;
                case ("D" || "d"): $pole[$i] = 13;
                                break;
                case ("E" || "e"): $pole[$i] = 14;
                                break;
                case ("F" || "f"): $pole[$i] = 15;
                                break;
                default: $pole[$i] = "ERROR";
                                break;
            }
    return $pole;
}

最初に文字列から配列を作成しましたが、今は文字を数字に変更したいと考えています。

私はこの文字列でそれをテストしています:$test = "AbCdEf2345"; 私は結果 10 11 12 13 14 15 2 3 4 5 を期待していましたが、私が持っているのは 10 10 10 10 10 10 2 3 4 5 だけです

私はいくつかの私の賭けをしていますか? (もちろん私はそうしていますが、どこで?)

4

4 に答える 4

1

("A" || "a") はブール値 'true' に評価されるため、すべての a から f は大文字と小文字 ("A" || "a" ) に引っ掛かり、結果は 10 になります。

hexdec() を使用せず、コードに最小限の変更を加えた場合:

function odstran_pismena($pole)
{
    $dlzka = count($pole);
    for ($i = 0; $i< $dlzka; $i++)
        switch ($pole[$i])
        {
            case 0: break;
            case 1: break;
            case 2: break;
            case 3: break;
            case 4: break;
            case 5: break;
            case 6: break;
            case 7: break;
            case 8: break;
            case 9: break;
            case "A":
            case "a": $pole[$i] = 10;
                            break;
            case "B":
            case "b": $pole[$i] = 11;
                            break;
            case "C":
            case "c": $pole[$i] = 12;
                            break;
            case "D": 
            case "d": $pole[$i] = 13;
                            break;
            case "E": 
            case  "e": $pole[$i] = 14;
                            break;
            case "F": 
            case "f": $pole[$i] = 15;
                            break;
            default: $pole[$i] = "ERROR";
                            break;
        }
     return $pole;
}
于 2013-07-20T13:27:40.367 に答える
0

指定case ("A" || "a"): $pole[$i] = 10;すると、 と評価されtrueます。したがって、一致したすべての文字trueは true を返します。「ケース」条件では、式の使用を避けてください。次のような比較する静的な値を使用します

case "A":
case "a":
    $pole[$i] = 10;
    break;
于 2013-07-20T13:12:12.737 に答える
0

ループ全体を使用hexdec()して、次のものに置き換える必要があります。for

for ($i = 0; $i< $dlzka; $i++)
{
  $pole[$i] = hexdec($pole[$i]);
}

無効な値を受け取る場合は、元の値0などを使用して、それが発生する可能性がある場合は個別に確認する必要があることに注意してください。is_numeric

于 2013-07-20T13:17:02.910 に答える
0

これを支援する簡単な方法は、strtolower を使用することです。

switch(strtolower($pole[$i])) {

   case "a" :...
    break;
   case "b": ...
    break;

}

または単に、関数の最初の行として:

$pole = strtolower($pole);

これにより、大文字と小文字を区別する必要がなくなります。

于 2013-07-20T13:15:43.110 に答える