代码之家  ›  专栏  ›  技术社区  ›  winwaed

将C(\0终止)字符串转换为PHP字符串

  •  4
  • winwaed  · 技术社区  · 14 年前

    目前,我将这些C样式字符串“修剪”为PHP格式,如下所示:

    $iv = strpos( $hashsalt8, "\0");
    if ($iv)
       $hashsalt8 = substr( $hashsalt8, 0, $iv );
    

    似乎很冗长,应该有一个单行函数调用,但我找不到它?

    注意:虽然在本例中“hash salt”名称意味着我可能知道原始字符串的长度,但在一般情况下这是未知的。显然,使用 substr() 当长度是先验的。

    3 回复  |  直到 14 年前
        1
  •  9
  •   You    14 年前

    使用 strstr :

    $hashsalt8 = strstr($hashsalt8, "\0", TRUE);
    

    strrev , substr strrchr 而是函数:

    $hashsalt8 = strrev(substr(strrchr(strrev($hashsalt8), "\0"), 1));
    
        2
  •  2
  •   gnarf    14 年前

    不应该有超过32字节的填充,对吧?(摘自你的评论)

    你也许可以这样做:

    preg_replace('/\x00.{0,32}$/', "", $hashsalt8);
    

    \x00 似乎打破了怀孕:)

        3
  •  2
  •   Jon Collins    14 年前

    这个 strtok

    $hashsalt8 = strtok($hashsalt8, "\0");

    斯特托克

    if ($hashsalt8[0] == "\0") {
      $hashsalt8 = '';
    }
    else {
      $hashsalt8 = strtok($hashsalt8, "\0");
    }
    

    注意,以零字节开头的输入字符串也会暴露当前代码中的错误。在这种情况下, strpos 会回来的 0 if ($iv)

    你应该使用 !== 操作员区分 false :

    $iv = strpos($hashsalt8, "\0");
    if ($iv !== false) {
       $hashsalt8 = substr($hashsalt8, 0, $iv);
    }