Mã BIC ở cuối một Container
**ISO 6346** là một chuẩn quốc tế quy định để mỗi số Container là duy nhất.

Chuẩn này được quy định và quản lý bởi International Container Bureau (BIC)

Thống nhất hệ thống
-------------------

Ví dụ về một số Container đúng chuẩn ISO 6346

Trong đó:

* CSQ là tên chủ sở hữu Container (hãng tàu)
* U là phần danh mục thiết bị. Có 03 chữ: U: tất cả container nói chung; J: các container có thể tháo lắp; Z: dành cho Moors và Chassis
* 305438 là phần số được cấp phát bởi hãng tàu và là duy nhất.
* 3 là con số cuối cùng dùng để kiểm tra số container có đúng chuẩn ISO 6346 (check digit).

### Quy tắc tính số Check Digit

* Tách số Cont (11 số) thành 02 phần: 10 ký tự đầu + số cuối cùng
* Tính toán 10 ký tự đầu => số Check Digit so sánh với số cuối cùng, nếu trùng nhau => hợp chuẩn ISO 6346

Ví dụ: Ta có số Cont: CSQU3054383

Ta sẽ tách 10 ký tự đầu: CSQU305438 để tính toán => số Check Digit

Nếu số Check Digit = 3 + đúng chuẩn ISO 6346.

Các chữ cái tương ứng với các con số trong bảng sau:

|  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| **A** | **B** | **C** | **D** | **E** | **F** | **G** | **H** | **I** | **J** | **K** | **L** | **M** |
| 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 23 | 24 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| **N** | **O** | **P** | **Q** | **R** | **S** | **T** | **U** | **V** | **W** | **X** | **Y** | **Z** |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | 35 | 36 | 37 | 38 |

|  | C | S | Q | U | 3 | 0 | 5 | 4 | 3 | 8 | Calc. |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|  | 13 | 30 | 28 | 32 | 3 | 0 | 5 | 4 | 3 | 8 |  |
| × | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 |  |
|  | 13 | 60 | 112 | 256 | 48 | 0 | 320 | 512 | 768 | 4096 | 6185 [a] |
| [b] Chia cho 11: | 562,272... |
| [c] Làm tròn: | 562 |
| [d] Nhân với 11: | 6182 |
| [a] trừ [d] = Check Digit: | **3** |

Như vậy trong ví dụ trên số Cont: **CSQU305438** sẽ có Check Digit = 3

### Một số giải thuật tính số Check Digit trong lập trình

#### Visual Basic (VBA)

```
Function ISO6346Check(k As String) ' Calculates the ISO Shipping Container Check Digit
Dim i%, s&
Application.Volatile
For i = 1 To 10
s = s + IIf(i < 5, Fix(11 \* (Asc(Mid(k, i)) - 56) / 10) + 1, Asc(Mid(k, i)) - 48) \* 2 ^ (i - 1)
Next i
ISO6346Check = (s - Fix(s / 11) \* 11) Mod 10
End Function

```

#### Java Script

```
function ISO6346Check(con) {
    if (!con || con == "" || con.length != 11) { return false; }
    con = con.toUpperCase();
    var re = /^[A-Z]{4}\d{7}/;
    if (re.test(con)) {
        var sum = 0;
        for (i = 0; i < 10; i++) {
            var n = con.substr(i, 1);
            if (i < 4) {
                n = "0123456789A?BCDEFGHIJK?LMNOPQRSTU?VWXYZ".indexOf(con.substr(i, 1));
            }
            n \*= Math.pow(2, i); //2的i次方
            sum += n;
        }
        if (con.substr(0, 4) == "HLCU") {
            sum -= 2;
        }
        sum %= 11;
        sum %= 10; //余数为10的取0
        return sum == con.substr(10);
    } else {
        return false; //不匹配正则表达式 
    }
}

```

#### PHP

```
function checkDigit($mark){
    $char2num = ['A'=>10, 'B'=>12, 'C'=>13, 'D'=>14, 'E'=>15, 'F'=>16, 'G'=>17, 'H'=>18, 'I'=>19, 'J'=>20, 'K'=>21, 'L'=>23, 'M'=>24, 'N'=>25, 'O'=>26, 'P'=>27, 'Q'=>28, 'R'=>29, 'S'=>30, 'T'=>31, 'U'=>32, 'V'=>34, 'W'=>35, 'X'=>36, 'Y'=>37, 'Z'=>38];

    $acc=0;
    $num=str\_split($mark);
    for($i=0;$i<10;$i++){
        if($i<4) $acc+=($char2num[$num[$i]]\*pow(2,$i));
        else $acc+=$num[$i]\*pow(2,$i);
    }
    $rem = $acc % 11;
    if ($rem == 10) $rem = 0;
    if(strlen($mark)==11 && $num[10]==$rem) return true;
    return false;
}

```

Liên kết ngoài
--------------

* Phần mềm Check container chạy trên di động Android

Tham khảo
---------