You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算及实现ISO 6346:2022标准规定的集装箱校验码算法?

按ISO 6346标准计算集装箱校验码的方法

核心算法步骤

  • 提取10位基础编码:集装箱编码的前10位,包含4位箱主/设备识别码和6位箱号。
  • 字符转数值:字母A-Z对应10到35(A=10、B=11……Z=35),数字0-9保持本身数值。
  • 分配权重:从左到右,第1位权重为2^0(即1),第2位为2^1(即2),以此类推,第10位权重为2^9(即512)。
  • 计算总和:将每个字符的数值与对应权重相乘,累加得到总数值。
  • 生成校验码:总数值对11取模,若余数为10则校验码为0,否则余数就是校验码。

代码实现(Python)

def calculate_iso6346_check_digit(container_code):
    # 处理输入:转为大写并验证长度
    code = container_code.strip().upper()
    if len(code) != 10:
        raise ValueError("基础编码必须是10位字符")
    
    # 构建字符-数值映射表
    char_to_num = {}
    # 字母映射:A-Z → 10-35
    for i in range(26):
        char_to_num[chr(ord('A') + i)] = 10 + i
    # 数字映射:0-9 → 0-9
    for i in range(10):
        char_to_num[str(i)] = i
    
    total = 0
    for idx, char in enumerate(code):
        num = char_to_num.get(char)
        if num is None:
            raise ValueError(f"编码包含无效字符: {char}")
        # 计算当前位的权重:2的索引次方(索引从0开始对应第1位)
        weight = 2 ** idx
        total += num * weight
    
    remainder = total % 11
    # 余数为10时校验码用0代替
    return '0' if remainder == 10 else str(remainder)

# 示例使用
if __name__ == "__main__":
    test_code = "CSLU212345"
    check_digit = calculate_iso6346_check_digit(test_code)
    print(f"校验码: {check_digit}")

验证示例

以基础编码CSLU212345为例:

  1. 字符转数值:C=12、S=28、L=21、U=30、2=2、1=1、2=2、3=3、4=4、5=5
  2. 加权求和:12×1 + 28×2 + 21×4 + 30×8 + 2×16 + 1×32 + 2×64 + 3×128 + 4×256 +5×512 = 4552
  3. 取模计算:4552 ÷ 11 = 413余9,因此校验码为9

内容的提问来源于stack exchange,提问作者Grkxbvn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:20:35