0

我正在尝试做一些可以传输 hexa do 二进制的程序。问题在于将 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

一个简单的帮助你的方法是使用 strtolower:

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

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

}

或者简单地说,作为函数的第一行:

$pole = strtolower($pole);

这样您就不必为上/下外壳而烦恼。

于 2013-07-20T13:15:43.110 回答
0

您应该使用hexdec()并替换整个for循环:

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

请注意,您将收到一个0无效值,因此您可能必须单独检查它是否可能发生,例如使用is_numeric原始值。

于 2013-07-20T13:17:02.910 回答
0

当您指定case ("A" || "a"): $pole[$i] = 10;它时,它的计算结果为true。所以你所有匹配的字符都true返回true。对于“case”条件,避免使用表达式。使用您比较的静态值,例如

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