Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将十进制ASCII转换为ASCII字符的PHP函数_Php_Ascii - Fatal编程技术网

将十进制ASCII转换为ASCII字符的PHP函数

将十进制ASCII转换为ASCII字符的PHP函数,php,ascii,Php,Ascii,我完全不知所措,试图转换一个十进制字符串,而不是oct,只是普通十进制,它在字符数上变化为纯文本 字符串看起来像: 49505197989100(123abcd) 如果我有办法预测字符串将包含什么内容,我可以整天使用chr(),但我真的没有,那么我该怎么办呢 您的问题是不明确的,因为在没有任何假设的情况下,一个输入字符串可能会导致所有满足约束的输出字符串的指数数量 我们假设ASCII是指ASCII的可读部分(而非控制部分)。因此,任何有效的ascii值都在32和128之间。因此,您知道,如果前两

我完全不知所措,试图转换一个十进制字符串,而不是oct,只是普通十进制,它在字符数上变化为纯文本

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


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

您的问题是不明确的,因为在没有任何假设的情况下,一个输入字符串可能会导致所有满足约束的输出字符串的指数数量

我们假设ASCII是指ASCII的可读部分(而非控制部分)。因此,任何有效的ascii值都在
32
128
之间。因此,您知道,如果前两个字符表示的值严格小于
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;
$s=“495051979899100”;
$n=strlen($s);
$result=“”;
对于($x=0;$x 128){
“假设错误”;
}
$x++;
}
$result.=chr($temp);
}
回声$结果;

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

$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;
$str='49505197999100';
$ind=0$out='';
而($ind=32){
$out.=chr($2);
$ind+=2;
}否则{
$out.=chr(substr($str,$ind,3));
$ind+=3;
}
}
回音$out;

我的奇思妙想,限制字符可以从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"

我猜这将是一个两步的过程。首先将十进制字符串转换为十六进制字符串,然后开始一次提取2个字符并将其转换为等效字符。你怎么知道4位数字是3/1、2/2还是1/3组合?我认为第一个问题是歧义消除。如何将
456
细分为
45
6
4
56
@MarkBaker:唯一的解决方案是假设使用的ascii码介于
32
128
之间,因此不存在双精度。为了清楚起见,我最初的评论假设十进制值代表一个数字,不是十进制值的concat。正如其他人指出的那样,concat无法可靠地转换。值得注意的是,如果一个小于32的字符进入该系统,该系统将严重失败。@Sharky:我完全同意,但这是唯一可以做到这一点的方法,因为否则,该系统是不明确的,因此它可以映射到指数数量的字符串。我会在答案中加入假设。是的,这是一个典型的情况,你必须找到问题的根源并解决问题的原因,而不是增加更多的复杂性,比如在这种情况下,猜测。在我之前的评论中谈到复杂性,现在在你的编辑中,你说“32和128”,您还必须更新您的代码,以符合以下声明(您的代码未检查
>128
)的要求:从根本上杀死它!不要再加了!哈哈,因为勇敢而死亡+1!(这些错误消息可能包含一些对最初制造混乱的家伙的咒骂
假设错误:告诉API创建者跳桥
)有限状态机解决所有任务,对吗?我打开一篇帖子只是为了键入相同的答案:)@mudasobwa,它很短,但不可读。很难找出这段代码的局限性。你真的认为这段代码的可读性不如
if
s和
chr
s的代码吗?这是非常可读的正则表达式的情况,因为它精确地再现了FSM中的状态。