亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2855 | 回復: 9
打印 上一主題 下一主題

這個convertChinese函數(shù)是什么意思呢? [復制鏈接]

論壇徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37處女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉雞
日期:2015-02-05 16:02:37
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2005-11-30 10:41 |只看該作者 |倒序瀏覽
有個Perl程序,需要轉(zhuǎn)換為C/C++程序,但是遇到了一個較為棘手的函數(shù),根本就不知道他要做什么。
該函數(shù)如下:

  1. sub convertChinese
  2. {
  3.   my ($x,$n, $len, $l, $h);
  4.   my (@c, @d);

  5.   $x = shift;
  6.   return unless defined $x;

  7.   @c = unpack("C*", $$x);
  8.   @d = ();

  9.   $len = @c;
  10.   for ($n = 0; $n < $len; $n++)
  11.   {
  12.                 if ($c[$n] == 194)
  13.                 {
  14.                   next;
  15.                 }
  16.                 elsif ($c[$n] == 195)
  17.                 {
  18.                   $l = $c[$n+1] % 16;
  19.                   $h = ($c[$n+1] - $l)/16;
  20.                   push (@d, (12+($h-8))*16+$l);
  21.                   $n++;
  22.                 }
  23.                 else
  24.                 {
  25.                   push(@d, $c[$n]);
  26.                 }
  27.   }
  28.   $$x = pack "C*",@d;
  29. }
復制代碼


請賜教!

論壇徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37處女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉雞
日期:2015-02-05 16:02:37
2 [報告]
發(fā)表于 2005-11-30 10:48 |只看該作者
函數(shù)里面用到了pack、unpack,我也看了這篇 pack/unpack用法----心得筆記 ,可是還不明白是什么意思。

論壇徽章:
1
榮譽會員
日期:2011-11-23 16:44:17
3 [報告]
發(fā)表于 2005-11-30 14:06 |只看該作者
[quote]原帖由 feeling 于 2005-11-30 10:41 發(fā)表
有個Perl程序,需要轉(zhuǎn)換為C/C++程序,但是遇到了一個較為棘手的函數(shù),根本就不知道他要做什么。
該函數(shù)如下:

  1. sub convertChinese
  2. {
  3.   my ($x,$n, $len, $l, $h);
  4.   my (@c, @d);

  5.   $x = shift;
  6. ... [/quote]
  7. [code]
  8. sub convertChinese
  9. {
  10. #--$x 是一個reference to scalar variable
  11. my ($x,$n, $len, $l, $h);
  12.   my (@c, @d);
  13. #---從第一個叁數(shù)抓進來...
  14.   $x = shift;
  15.   return unless defined $x;
  16. #把$$x 依unsign integer unpack出來.....
  17. #存放在@c中...
  18.   @c = unpack("C*", $$x);
  19.   @d = ();

  20.   $len = @c;
  21. #--針對每一個char....去比對數(shù)值.....
  22.   for ($n = 0; $n < $len; $n++)
  23.   {
  24.                 if ($c[$n] == 194)
  25.                 {
  26.                   next;
  27.                 }
  28.                 elsif ($c[$n] == 195)
  29.                 {
  30.                   $l = $c[$n+1] % 16;
  31.                   $h = ($c[$n+1] - $l)/16;
  32.                   push (@d, (12+($h-8))*16+$l);
  33.                   $n++;
  34.                 }
  35.                 else
  36.                 {
  37.                   push(@d, $c[$n]);
  38.                 }
  39.   }
  40. #---處理完後...將數(shù)值在pack回原來的$$x....
  41.   $$x = pack "C*",@d;
  42. }
復制代碼


注意這個subroutine...因為對reference 作動作..所以即便他沒有return任何數(shù)值..
但是$$x的數(shù)值已經(jīng)更動了.....
他應該是在作過濾的動作吧.....

論壇徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37處女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉雞
日期:2015-02-05 16:02:37
4 [報告]
發(fā)表于 2005-11-30 15:31 |只看該作者
原帖由 apile 于 2005-11-30 14:06 發(fā)表
注意這個subroutine...因為對reference 作動作..所以即便他沒有return任何數(shù)值..
但是$$x的數(shù)值已經(jīng)更動了.....
他應該是在作過濾的動作吧.....


多謝指教,應該是對文本流中的特殊字符做過濾的吧。
這個程序在調(diào)用該函數(shù)后對文本流做了截取操作:

  1.     convertChinese($Msg);
  2.     @at = ();
  3.     for ($i = 0; $i < 16; $i++)
  4.     {
  5.       $str = substr($Msg, $i*254, 254);
  6.       if (!defined($str) || length($str) <= 0)
  7.       {
  8.         push(@at, "");
  9.       }
  10.       else
  11.       {
  12.         push(@at, "$str");
  13.       }
  14.     }
復制代碼


根據(jù)該函數(shù)名稱大致上可以推斷是針對中文字符的一些操作,因為后面有substr的操作,如果有中文字符的話可能會出錯。

論壇徽章:
0
5 [報告]
發(fā)表于 2005-11-30 18:31 |只看該作者


  1.                 if ($c[$n] == 194)
  2.                 {
  3.                   next;
  4.                 }
  5.                 elsif ($c[$n] == 195)
  6.                 {
  7.                   $l = $c[$n+1] % 16;
  8.                   $h = ($c[$n+1] - $l)/16;
  9.                   push (@d, (12+($h-8))*16+$l);
  10.                   $n++;
  11.                 }
  12.                 else
  13.                 {
  14.                   push(@d, $c[$n]);
  15.                 }
復制代碼

意思是過濾0xC2,過濾0xC3并且把他后面的緊跟著的字節(jié)高4位“12+($h-)*16”,
不知道什么用,

  1.     @at = ();
  2.     for ($i = 0; $i < 16; $i++)
  3.     {
  4.       $str = substr($Msg, $i*254, 254);
  5.       if (!defined($str) || length($str) <= 0)
  6.       {
  7.         push(@at, "");
  8.       }
  9.       else
  10.       {
  11.         push(@at, "$str");
  12.       }
  13.     }
復制代碼

分成254字節(jié)每塊的字符串,

沒有上下問,看不明白convertChinese有什么用,

想不出c2,c3有什么特別,

論壇徽章:
1
榮譽會員
日期:2011-11-23 16:44:17
6 [報告]
發(fā)表于 2005-12-01 08:44 |只看該作者
原帖由 angleeye 于 2005-11-30 18:31 發(fā)表
[code]

                if ($c[$n] == 194)
                {
                  next;
                }
                elsif ($c[$n] == 195)
                {
                  $l = $c[$n+1 ...


我也不知道..
但是如果他是 "\" 或是某些特殊字符...
也許他們代碼碰到這些字符...會有問題...
那這樣過濾就有意義了....

論壇徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37處女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉雞
日期:2015-02-05 16:02:37
7 [報告]
發(fā)表于 2005-12-26 17:03 |只看該作者
最后是要執(zhí)行一個數(shù)據(jù)庫的入庫操作,如果有特殊字符可能會有問題吧。

論壇徽章:
0
8 [報告]
發(fā)表于 2005-12-27 21:45 |只看該作者
很討厭可讀性差的代碼,雖然效率很高

論壇徽章:
0
9 [報告]
發(fā)表于 2005-12-27 21:48 |只看該作者
原帖由 RobinHoo 于 2005-12-27 21:45 發(fā)表
很討厭可讀性差的代碼,雖然效率很高


什么叫做可讀性差?那是對你而言吧?
多數(shù)人并不覺得pack/unpack可讀性差。

論壇徽章:
0
10 [報告]
發(fā)表于 2005-12-28 10:12 |只看該作者
unpack和pack不是很難理解的!
不知道是自己的習慣還是真的閱讀能力上有問題。我認為好的/有可讀性的代碼是從變量命名就開始做起的。大量無意義的變量名,令人很頭痛。即使我能像機器一樣分析出代碼執(zhí)行的結(jié)果,但那時對于代碼的物理理解,不是對于它解決問題的算法的理解。最近我在用perl重寫CNPRINT,一個中國人寫得很好的一個解決UNIX下漢字/日文/韓文打印的程序。他的源代碼是公布出來的,但是可讀性很差。我不能責備他,因為這只是一個醫(yī)學博士的業(yè)余愛好而已。不過,這么好的解決方法沒有被推廣和被主流linux用于解決CJK打印很大程度上由于代碼的可讀性。我之所以要用perl重寫是想有人能看懂我代碼后再用C改寫成功能更強大的代碼。下面是我代碼的片斷?赡芎懿籶erl化。但是很容易讀懂。
<CODE>
#!/usr/bin/perl -w
our @ParameterList;
our $ValidParameters="SioHtc";
our $DEBUG=1;
our $SILENT=0;
our @Input;
our @InputBuff;
our @Output;
our @OutputBuff;
our $Language="auto";
our @CodeTypes=("shiftjis","gb2312","big5","gbk","jis");
our @CharUsage;
our $InUseCode;

sub convert2Unicode
{
        my $code=shift;
        my $code_type=shift;
        local $FileName;
        local $CodeType;
        foreach $CodeType (@CodeTypes)
        {
                $FileName="/CNPRN/CODE/".$CodeType.".txt";
                next if (($code_type ne "auto") and ($CodeType ne $code_type));
                if (!(open(CodeFile,$FileName)))
                {
                        print STDERR "Unicode covert file open error of codetype $CodeType!\nPlease check the file path $FileName!\n";
                        return 0 if ($code_type ne "auto");
                }
                my @FileBuff=<CodeFile>;
                close(CodeFile);
                foreach my $LineBuff (@FileBuff)
                {
                        next if ($LineBuff!~/^0[xX]/);
                        chomp $LineBuff;
                        ($Code,$Unicode)=(split(/\t/,$LineBuff));
                        if ($code==hex($Code))
                        {
                                $InUseCode=$CodeType;
                                close(CodeFile);
                                return hex($Unicode);
                        }
                }
        }
        return 0;
}

sub updateCharUsage
{
        my $Code=shift;
        local $i;
        for($i=0;$i<@CharUsage;$i++)
        {
                last if ($CharUsage[$i]{Code}==$Code);
        }
        $CharUsage[$i]{Code}=$Code;
        $CharUsage[$i]{Freq}++;
        $CharUsage[$i]{CodeType}=$InUseCode;
}

sub getCharFreq
{
        my $Code=shift;
        local $i;
        for($i=0;$i<@CharUsage;$i++)
        {
                return $CharUsage[$i]{Freq} if ($CharUsage[$i]{Code}==$Code);
        }
        return 0;
}

sub getCharOrd
{
        my $Code=shift;
        local $i;
        for($i=0;$i<@CharUsage;$i++)
        {
                return $i if ($CharUsage[$i]{Code}==$Code);
        }
        return -1;
}

sub errorHandler
{
        my $ErrorMsg=shift;
        my @ErrorPrg=caller;
        my $DisplayMsg=($SILENT==0)?$ErrorMsg."\n".($DEBUG?"In function $ErrorPrg[0]() of file $ErrorPrg[1] at line #$ErrorPrg[2].\n":""):"";
        system("time /T");
        die($DisplayMsg);       
}

sub getParameterValue
{
        my $Item=shift;
        for(my $i=0;$i<@ParameterList;$i++)
        {
                return $ParameterList[$i]{"Value"} if ($ParameterList[$i]{"Parameter"} eq $Item);
        }
        return -1;
}

sub getInput
{
        my $FileName=getParameterValue("i");
        if (length($FileName)==0)
        {
                errorHandler("Can not open the STANDARD or PIPE\n") if (!(open(INPUT,STDIN)));               
        }
        else
        {
                errorHandler("Can not open the input file $FileName\n") if (!(open(INPUT,$FileName)));
        }
        @InputBuff=<INPUT>;
        close(INPUT);
}

sub unicodeFile
{
        local $Index;
        for($Index=0;$Index<@InputBuff;$Index++)
        {
                local $LineBuff=$InputBuff[$Index];
                chomp $LineBuff;
                local $Counter=1;
                for(my $SubIndex=0;$SubIndex<length($LineBuff);$SubIndex++)
                {
                        local $BinaryCode=ord(substr($LineBuff,$SubIndex,1));
                        local $Unicode;
                        $Unicode=convert2Unicode($BinaryCode,$Language);
                        updateCharUsage($Unicode) if (($Unicode!=$BinaryCode) and ($Unicode!=0));
                        if ($Unicode==0)
                        {
                                $SubIndex++;
                                $BinaryCode=$BinaryCode*256+ord(substr($LineBuff,$SubIndex,1)) ;
                                $Unicode=convert2Unicode($BinaryCode,$Language);
                        }
                        errorHandler("Can not convert $Language code $BinaryCode to Unicode, which is located in line $Index column $SubIndex!\n") if ($Unicode==0);
                        $Input[$Index][$Counter]=$Unicode;
                        updateCharUsage($Unicode);
                        $Counter++;                       
                }
                $Input[$Index][0]=$Counter-1;
        }
}
</CODE>
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP