如何计算及实现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为例:
- 字符转数值:C=12、S=28、L=21、U=30、2=2、1=1、2=2、3=3、4=4、5=5
- 加权求和:12×1 + 28×2 + 21×4 + 30×8 + 2×16 + 1×32 + 2×64 + 3×128 + 4×256 +5×512 = 4552
- 取模计算:4552 ÷ 11 = 413余9,因此校验码为9
内容的提问来源于stack exchange,提问作者Grkxbvn
相关产品推荐
相关产品推荐

