Posts tagged with PHP

驗證 Base64 編碼字串

以往我以為驗證 Base64 編碼字串只要檢查它是由英文、數字、加號(+)、斜線(/)、等號(=)組成就好,但最近寫某個程式時踢到鐵板。我從原始資料中抓出一段 Base64 字串,無法使用 .NET 中的 Convert.FromBase64String() 對其進行轉換,但將同樣的字串交給 PHP 的 base64_decode() 卻又能正確處理。

經過我研究之後發現,Base64 編碼字串長度必為 4 的倍數,而等號的功能就是加在字串末端,確保其長度為 4 的倍數,因此等號也只會出現在字串末端,並不會出現在中間。此外,由於等號的功能只是要讓字串長度為 4 的倍數,故正確來說等號最多只能有 3 個,PHP 的 base64_decode() 則比較隨和,你高興的話,只要沒有 Out of Memory,要加幾個等號都沒關係 XD

最後整理一下驗證 Base64 編碼字串的方法:

  1. 字串由英文、數字、加號(+)、斜線(/)組成,末端可能還有 1—3 個等號(=)。
  2. 字串長度必為 4 的倍數,可以自行在字串末端增減等號的數目以符合此條件。

UAODecode

完全是無聊而寫了這個,我自己也用不到 XD

這個 PHP Class 的功能是將 Big5 中文及 Unicode-At-On 新增字轉換為 UTF-8 或 NCR。本程式移植自 PCMan 2007 ,所以採用 GNU GPL 授權。

下載

使用方法

<?php
    // 輸出 UTF-8
    echo UAODecode::big5_to_utf8('Unicode-At-On 文字');

    // 輸出 NCR
    echo UAODecode::big5_to_ncr('Unicode-At-On 文字');
?>

hsv2rgb()

這個函式的用途是將以 HSV 表示的顏色轉換成 RGB 色碼,演算法來自 Wikipedia ,目前網站的隨日期變色效果就是用此 function 來達成的。

$H 的範圍為 0—360 , $S 的範圍為 0—100 , $V 的範圍為 0—100

function hsv2rgb($H, $S, $V)
{
    if ( $V == 0 )
    {
        $R = 0;
        $G = 0;
        $B = 0;
    }
    else if ( $S == 0 )
    {
        $V = $V / 100;
        $R = $V * 255;
        $G = $V * 255;
        $B = $V * 255;
    }
    else
    {
        //這一段是讓 $H 也能輸入小於 0 或大於 360 的數字,這樣用起來比較方便
        if ( $H > 360 )
        {
            $H = $H % 360;
        }
        else if ( $H < 0 )
        {
            $H = 360 + ( $H % 360 );
        }

        $S = $S / 100;
        $V = $V / 100;
        $Hf = $H / 60;
        $Hi = floor( $Hf );
        $f = $Hf - $Hi;
        $p = $V * ( 1 - $S );
        $q = $V * ( 1 - $S * $f );
        $t = $V * ( 1 - $S * ( 1 - $f ) );

        switch ( $Hi ) {
            case 0:
                $R = $V * 255;
                $G = $t * 255;
                $B = $p * 255;
                break;
            case 1:
                $R = $q * 255;
                $G = $V * 255;
                $B = $p * 255;
                break;
            case 2:
                $R = $p * 255;
                $G = $V * 255;
                $B = $t * 255;
                break;
            case 3:
                $R = $p * 255;
                $G = $q * 255;
                $B = $V * 255;
                break;
            case 4:
                $R = $t * 255;
                $G = $p * 255;
                $B = $V * 255;
                break;
            case 5:
                $R = $V * 255;
                $G = $p * 255;
                $B = $q * 255;
                break;
        }
    }

    return '#' . str_pad(dechex(round($R)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($G)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($B)), 2, "0", STR_PAD_LEFT);
}