Iso 6346
Giao diện
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
[sửa | sửa mã nguồn]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
[sửa | sửa mã nguồn]- 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
[sửa | sửa mã nguồn]Visual Basic (VBA)
[sửa | sửa mã nguồn]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
[sửa | sửa mã nguồn]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
[sửa | sửa mã nguồn]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;
}