如何檢查貨櫃號碼(集裝箱號碼)是否正確?

如何檢查貨櫃號碼(集裝箱號碼)是否正確?除了從資料庫尋找是否有此櫃號外,也可以透過核對校驗碼的方式來檢查該櫃號是否正確。 本篇我們就來研究一下貨櫃號碼的編碼規則和其校驗碼(或稱檢查)的取得方法,另外再提供之前寫的取得校驗碼的這段程式。

  1. 貨櫃號碼(集裝箱號碼)的編碼規則
  2. 校驗碼Value of check digit 的計算方法
  3. 以程式語言C#來取得校驗碼

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. 貨櫃號碼(集裝箱號碼)的編碼規則 :

在 ISO 6346 的第3部分 (3. Identification system and its associated marks) 對貨櫃號碼的編碼有詳細說明:此識別系統(指貨櫃號碼/集裝箱號碼)共11碼,應由以下要素組成:

  • 所有者代碼(3碼):

貨櫃所有人代碼由三碼(三個大寫字母)組成母,是唯一的並應與國際集裝箱局 (BIC - Bureau International des Conteneurs) 註冊。

  • 設備類別(1碼);

設備類別由以下三個拉丁字母大寫字母之一組成,

U :代表所有貨運貨櫃 

J :為可拆卸貨櫃相關設備 

Z :用於拖車和板架

  • 序號(6碼):

由 6 位數字組成,如不足6位則前面補0,由所有者或運營商自行配號。    

  • 校驗碼(1碼): 

只有一個數字,此校驗碼用以驗證上面的所有者代碼、設備類別和序號是否正確。

2. 校驗碼(Value of check digit)的計算方法

    如上可知,一個貨櫃號碼含校驗碼應該是11碼,校驗碼的確定是經由一定的計算程序取得。可以透過以下A.1A.4的說明即可了解其計算方法

  • A.1 等效值(Numerical equivalents ) :˙
貨櫃號碼的1到10碼都將被附於一個值(Equivalent values),各碼的值如表A的A.1 Equivalent values 部分。
  • A.2 加權因子(Weighting factor) :
貨櫃號碼的1到10的每一個位置也被附於一個加權值(Weighting Values)如表A的A.2 Weighting Values 部分。
  • A.3 模數(Modulus):
模數就是一個數除以另一個數的餘數。在此為各個字元的A.1和A.2相乘後加總再除以11的餘數
  • A.4 校驗碼(Value of check digit):
A.3計算後取得的模數(餘數),其個位值(餘數為10時取0)就是我們要的校驗碼(Value of check digit)

歸納以上說明如下表A:

表A

表A.1

以櫃號TCNU4260450為例,其校驗碼為0,將計算過程列於下表:



3. 以程式語言C#來取得校驗碼
private static string getCheckDigitForContainerNo(string ContainerNo, ref string errString)
{
    string checkdigit = "";
    try
    {
        //1. store ContainerNo to array
        char[] ContainerChar = ContainerNo.ToCharArray();
        int[] EquivalentValuePerChar = new int[10];
        int[] WeightValue = new int[10];

        //Assign Weight values
        int value = 2;
        for(int power=0; power<=9; power++)                
            WeightValue[power] = (int)Math.Pow(value, power);    
        
        //Assign Equivalent Values           
        for (int i = 0; i <= 9; i++)
        {
            switch (ContainerChar[i])
            {
                case 'A':
                    if (i < 4) EquivalentValuePerChar[i] = 10;
                    break;
                case 'B':
                    if (i < 4) EquivalentValuePerChar[i] = 12;
                    break;
                case 'C':
                    if (i < 4) EquivalentValuePerChar[i] = 13;
                    break;
                case 'D':
                    if (i < 4) EquivalentValuePerChar[i] = 14;
                    break;
                case 'E':
                    if (i < 4) EquivalentValuePerChar[i] = 15;
                    break;
                case 'F':
                    if (i < 4) EquivalentValuePerChar[i] = 16;
                    break;
                case 'G':
                    if (i < 4) EquivalentValuePerChar[i] = 17;
                    break;
                case 'H':
                    if (i < 4) EquivalentValuePerChar[i] = 18;
                    break;
                case 'I':
                    if (i < 4) EquivalentValuePerChar[i] = 19;
                    break;
                case 'J':
                    if (i < 4) EquivalentValuePerChar[i] = 20;
                    break;
                case 'K':
                    if (i < 4) EquivalentValuePerChar[i] = 21;
                    break;
                case 'L':
                    if (i < 4) EquivalentValuePerChar[i] = 23;
                    break;
                case 'M':
                    if (i < 4) EquivalentValuePerChar[i] = 24;
                    break;
                case 'N':
                    if (i < 4) EquivalentValuePerChar[i] = 25;
                    break;
                case 'O':
                    if (i < 4) EquivalentValuePerChar[i] = 26;
                    break;
                case 'P':
                    if (i < 4) EquivalentValuePerChar[i] = 27;
                    break;
                case 'Q':
                    if (i < 4) EquivalentValuePerChar[i] = 28;
                    break;
                case 'R':
                    if (i < 4) EquivalentValuePerChar[i] = 29;
                    break;
                case 'S':
                    if (i < 4) EquivalentValuePerChar[i] = 30;
                    break;
                case 'T':
                    if (i < 4) EquivalentValuePerChar[i] = 31;
                    break;
                case 'U':
                    if (i < 4) EquivalentValuePerChar[i] = 32;
                    break;
                case 'V':
                    if (i < 4) EquivalentValuePerChar[i] = 34;
                    break;
                case 'W':
                    if (i < 4) EquivalentValuePerChar[i] = 35;
                    break;
                case 'X':
                    if (i < 4) EquivalentValuePerChar[i] = 36;
                    break;
                case 'Y':
                    if (i < 4) EquivalentValuePerChar[i] = 37;
                    break;
                case 'Z':
                    if (i < 4) EquivalentValuePerChar[i] = 38;
                    break;
                default:
                    if (i >= 4 && i <= 9)
                        EquivalentValuePerChar[i] = int.Parse(ContainerChar[i].ToString());
                    break;
            }
        }

        //3. Get Grand TTL
        int GrdTTL = 0;
        int RtvCheckDigitLength = 1;
        for (int i = 0; i <= 9; i++)              
            GrdTTL = GrdTTL + EquivalentValuePerChar[i] * WeightValue[i];                

        //4. Get checkdigit
        string Remainder = (GrdTTL % 11).ToString();                
        checkdigit = Remainder.ToString().Substring(Remainder.ToString().Length - RtvCheckDigitLength, RtvCheckDigitLength);
    }
    catch (Exception ex)
    {
        string err = ex.ToString();
        errString = "The Check digit cannot be calculated because of wrong Container number...!";
    }

    if (checkdigit == "")
        errString = "The Check digit cannot be calculated because of wrong Container number...!";

    return checkdigit;
}
Read More »

如何將Windows 10(或 Windows 11)的帳戶更改為本機帳戶(Local Account)?

Microsoft 希望您在 Windows 10 (或 Windows 11) 中使用微軟帳戶(Microsoft Account),所以當你安裝或使用Windows和Office過程中常常會引導你登入微軟帳戶,導致你的Windows的登入帳戶由"本機帳戶(Local Account)"被改為"微軟帳戶"。

在說明如何將Windows 10(或 Windows 11)的帳戶更改為"本機帳戶"前,我們先了解一下"本機帳戶"和"微軟帳戶"的差異:

  • 本機帳戶(Local Account):

顧名思義該帳戶為本機所有,也就是您的Windows本身的帳號與網路上的帳戶無關。所以從資料安全方面來說相對安全;也因為它沒有和網路或雲端上的帳號綁定,所以在使用上相對單純。

  • 微軟帳戶(Microsoft Account):

顧名思義該帳戶為微軟的帳號,如果你以前曾經申請或用過Outlook, Hotmail...等服務,那你就已經有此帳號了。

當安裝或使用過程中系統會常常提示你輸入此帳號,你輸入以後,你的Windows 10帳戶號就會和此帳號綁在起了。

也就是說你Window 10(或Windows 11)開機後你必須以此帳號登入。

其好處是微軟所有的本機應用程式或雲端的應用都不用再做登入的動作;

壞處是你的個人帳號一直處於連線狀態,可能會有資安問題(包括如果你的電腦會與他人共用,你的個人資訊很容易的被他人瀏覽),

另外,如果網路中斷,你的電腦也可能會變得不能用。

如果你現在使用微軟帳戶卻想改為本機帳戶,請繼續看以下的教學 -- 如何將Windows 10(或 Windows 11)的帳戶更改為"本機帳戶"?

1. 開始>設定>帳戶>[改為使用本機帳戶登入]


2. 點選[下一步]


3. 如果有PIN碼就輸入PIN碼,否則就輸入微軟帳號的密碼。


4. 本機帳號、密碼及密碼提示都要填,再點[下一步]。


5. 點選[登出並完成],Windows就重新開機即可以本機帳號登入。




Read More »

開IE卻自動開啟Edge瀏覽器,如何恢復使用IE?

我的網站上的有一個查詢需使用Microsoft Silverlight外掛,但現在的瀏覽器Edge, Chrome, Firefox等都已不再支援Silverlight,也就是說這個查詢功能在這些瀏覽器上已無法執行。

詳細資訊可瀏覽以下微軟提供的資訊或點此連結 :

Microsoft Silverlight 將于 2021 年 10 月 12 日終止支援。 隨著 2020 年 1 月 31 日即將終止對 Internet Explorer 10 的支援,目前只有在 Internet Explorer 10 和 Internet Explorer 11 上支援 Silverlight 開發架構。 不再支援 Chrome、Firefox 或任何使用 Mac 作業系統的瀏覽器。

以上問題,如果要更改程式需要一些時間,應急的方式就是請使用者重新使用舊版的IE瀏覽器。

但是很多人會發現當我們點選IE來開啟時但系統卻自動改用Edge來開啟網站。

  • 要如何關閉"開IE卻自動開啟Edge瀏覽器"的設定? 方法如下:

Edge > 設定 > 預設瀏覽器 > 將[在 Microsoft Edget 中以 Internet Explorer 開啟網站]改為"永不"或"僅限不相容的網站"。如下圖 : 




 











  • 另一個方式是"在Edge內開啟IE模式",方法如下 :
先進入你要查詢的網站 > 點選...(就是[設定及其他],在Edge瀏覽器右上角) > [在 Internet Explorer 模式中重新載入] ,如下圖 :

再點選[完成],如下圖:

 

如果你的網站處於IE模式,Edge瀏覽器會出現"您目前處於Internet Explorer模式...",如下圖:

 

  • 在Edge內開啟IE模式,進階使用說明 :

如果經常使用某網站,你可以在[完成]前將開啟[下次在Internet Explorer模式中開啟此頁面](如下圖3-1),開啟後Edge會將該網址記錄起來(如下圖3-2),下次再使用該網站時就會自動啟用IE模式。

圖3-1
開啟後Edge會將該網址記錄到 > 設定 > 預設瀏覽器 > [Intenet Explorer 模式頁面] :
        圖3-2




Read More »
>