【问题标题】:A PHP function to convert decimal ASCII to ASCII char将十进制 ASCII 转换为 ASCII 字符的 PHP 函数
【发布时间】:2014-10-03 07:34:34
【问题描述】:

我完全不知所措,试图转换一个十进制字符串,而不是八进制,只是简单的十进制,它的字符数会改变为纯文本。

字符串看起来像: 495051979899100 (123abcd)

如果我有办法预测字符串将包含什么,我可以整天使用 chr(),但我真的不知道,那我该怎么办?

【问题讨论】:

  • 我猜这将是一个两步过程。首先将十进制字符串转换为十六进制字符串,然后开始一次提取 2 个字符并将它们转换为对应的字符。
  • 你怎么知道 4 位数字是 3/1、2/2 还是 1/3 组合?
  • 我认为第一个问题是消歧。你如何将456细分为456456
  • @MarkBaker:唯一的解决方案是假设使用的 ascii 在 32128 之间,所以没有双精度数。
  • 为了清楚起见,我最初的评论假设十进制值代表一个数字,而不是十进制值的连接。正如其他人指出的那样,concat 不能可靠地转换。

标签: php ascii


【解决方案1】:

在没有任何假设的情况下,您的问题是模棱两可的,输入字符串可能会导致所有满足约束的输出字符串呈指数级增长。

我们假设 ASCII 是指 ascii 的可读(不是控制部分)。因此任何有效的 ascii 值都在32128 之间。结果,您知道如果前两个字符表示一个值,严格小于32,它将在100+ 范围内。

你的算法应该同时做两件事:

  • 读出前两个字符。
  • 如果值小于32,则该值在100+范围内,因此读取三个字符并转换,如果不在-100范围内,则转换两个字符。李>

或者在 PHP 中:

$s = "495051979899100";
$n = strlen($s);
$result = "";
for ($x=0; $x<=$n; $x += 2) {
    $temp = intval(substr($s,$x,2));
    if($temp < 32) {
        $temp = intval(substr($s,$x,3));
        if($temp > 128) {
            die "Assumption error";
        }
        $x++;
    }
    $result .= chr($temp);
}
echo $result;

【讨论】:

  • 值得注意的是,如果一个小于32的字符进入该系统,系统将惨遭失败。
  • @Sharky:我完全同意,但这是唯一可以做到的方法,否则系统会模棱两可,因此它可以映射到指数数量的字符串。我会将假设添加到答案中。
  • 是的,这是一个典型的情况,您必须找到问题的根源并解决原因,而不是增加更多的复杂性,就像在这种情况下,猜测的东西。
  • 在我之前的评论中谈论复杂性,现在您的编辑说“32 和 128”,您还必须更新您的代码以符合此声明(您的代码不检查 &gt;128)告诉你复杂性:从根本上杀死它!不要添加更多!
  • 大声笑,因为勇敢而死 +1! (这些错误消息可能包含对最初造成混乱的人的一些咒骂Assumption Error: Tell the API creator to jump off a bridge
【解决方案2】:

是的,写了几乎相同的代码

$str = '495051979899100';
$ind = 0; $out = '';
while($ind < strlen($str))
{
    $two = substr($str, $ind, 2);
    if ($two >= 32) {
        $out .= chr($two);
        $ind += 2;
    } else {
        $out .= chr(substr($str, $ind, 3));
        $ind += 3;        
    }
}

echo $out;

【讨论】:

    【解决方案3】:

    我的奇特方式限制了 char 可以从 32 到 128。

    $value = '495051979899100';
    preg_match_all('/3[2-9]|[4-9][0-9]|1[0-1][0-9]|12[0-8]/', $value, $matches);
    var_dump(implode(array_map('chr',$matches[0])));
    // string(7) "123abcd"
    

    【讨论】:

    • 有限状态机可以解决所有任务,对吧?我打开一个帖子只是为了输入相同的答案:)
    • @mudasobwa ,它很短,但不可读。很难找出这段代码的限制。
    • 你真的认为这比ifs 和chrs 周围的舞蹈可读性差吗?这就是 非常 可读的正则表达式的情况,因为它完全再现了 FSM 中的状态。
    • 我比这个正则表达式更喜欢貘照片方式。
    猜你喜欢
    • 2010-12-03
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多