php 比较字符串 是否用二进制安全的更可靠, 在看一些开源的东西经常看到进行二进制安全的比较 比如说 strncmp,srtrcmp等为何要进行二进制安全的去比较,是否用二进制安全的更可靠求大侠指教

解决方案 »

  1.   

    同求高人解答。个人感觉php里面如果不直接操作二进制文件和套接字的话,用不到二进制安全的东西。
      

  2.   

    我觉得php的字符串在内存里保存的时候就是二进制,而不像一些平台语言(比如.NET JAVA等)会对它进行字符集处理。因此php里二进制安全是很模糊的。
      

  3.   

    这个问题问的...计算机就认二进制码,转化为十进制或字符串是为了人能读而不是计算机,你认为
    if('a' == 'a')

    if(ord('a') == ord('a'))
    在计算机内部运行会有什么区别吗?
      

  4.   

    比较字符串,除了相等还有大于和等于的情况。
    strcmp是沿袭C语言中的函数。
    比较结果可以返回大小关系(或是否相等关系)
    至于是否是二进制安全,感觉完全扯淡。。像斑竹说的:
      

  5.   


    ZEND_API int zend_binary_strncmp(const char *s1, uint len1, const char *s2, uint len2, uint length) /* {{{ */
    {
            int retval;        retval = memcmp(s1, s2, MIN(length, MIN(len1, len2)));
            if (!retval) {
                    return (MIN(length, len1) - MIN(length, len2));
            } else {
                    return retval;
            }
    }
    /* }}} *//* {{{ proto int strncmp(string str1, string str2, int len)
       Binary safe string comparison */
    ZEND_FUNCTION(strncmp)
    {
            char *s1, *s2;
            int s1_len, s2_len;
            long len;        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ssl", &s1, &s1_len, &s2, &s2_len, &len) == FAILURE) {
                    return;
            }        if (len < 0) {
                    zend_error(E_WARNING, "Length must be greater than or equal to 0");
                    RETURN_FALSE;
            }        RETURN_LONG(zend_binary_strncmp(s1, s1_len, s2, s2_len, len));
    }
    /* }}} */
      

  6.   

    retval = memcmp(s1, s2, MIN(length, MIN(len1, len2)));
    可以看到,php的strncmp函数实际上是去调用c语言的memcmp函数来进行的比较。
    4楼的意思貌似是其他语言会对不同字符集的字符串进行字符集统一后再进行比较。php的大部分函数都是沿用c的。c语言的编译器已经处理了不同字符集的问题。所以php不必操心这个。内容相同会被c语言编译器处理为相同字符集后再放到内存中进行二进制比较。