【zxing】Ean13 Contents do not pass checksum

本文详细解释了EAN-13商品条码中的校验符作用与计算方法,并提供了一个Java代码示例来验证条码是否符合规定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用zxing生成条形码,如果没对输入的内容进行判断校验码校验的话,就会报错

EAN-13商品条码中的校验符用字符集中的C子集表示,校验符的作用是检验前面12个数字是否正确,在条码机每次读入数据时,都会计算一次数据符的校验并与校验符进行比对。校验符的计算方法非常简单,将12个数据符从左起将所有的奇数位相加得出一个数a,将所有的偶数位相加得出一个数b,然后将数b乘以3再与a相加得到数c,用10减去数c的个位数,如果结果不为10则检验符为结果本身,如果为10则检验符为0。

示例

例如:690123456789

690表示国家代码:中华人民共和国

1234表示生产商代码

56789表示产品代码

计算其校验符的过程为:

奇数位和:6 + 0 + 2 + 4 + 6 + 8 = 26

偶数位和:9 + 1 + 3 + 5 + 7 + 9 = 34

将奇数位和与偶数位和的三倍相加:26 + 34 * 3 = 128

取结果的个位数:128的个位数为8

用10减去这个个位数:10 - 8 = 2

所以校验码为2

(注:如果取结果的个位数为0,那么校验码不是为10 (10 - 0 = 10),而是0。)

java 检验代码,true为条码符合规定,false反之

public static boolean checkStandardUPCEANChecksum(CharSequence s) throws FormatException {
		int length = s.length();
		if (length == 0) {
			return false;
		}

		int sum = 0;
		for (int i = length - 2; i >= 0; i -= 2) {
			int digit = (int) s.charAt(i) - (int) '0';
			if (digit < 0 || digit > 9) {
				throw FormatException.getFormatInstance();
			}
			sum += digit;
		}
		sum *= 3;
		for (int i = length - 1; i >= 0; i -= 2) {
			int digit = (int) s.charAt(i) - (int) '0';
			if (digit < 0 || digit > 9) {
				throw FormatException.getFormatInstance();
			}
			sum += digit;
		}
		return sum % 10 == 0;
	}


### 使用ZXing库生成EAN13条形码 为了使用ZXing库生成EAN13条形码,开发者可以利用该库提供的强大工具简化编码流程。以下是具体实现方式: #### 准备工作 确保已引入ZXing库到项目环境中。对于Maven项目,可以在`pom.xml`文件中加入如下依赖项[^1]。 ```xml <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.4.1</version> </dependency> ``` #### Java代码示例 下面是一段完整的Java程序,展示了如何使用ZXing库生成并保存一张EAN13格式的条形码图片至本地磁盘。 ```java import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.util.HashMap; import java.util.Map; public class EAN13Generator { private static final int WIDTH = 300; // 图片宽度 private static final int HEIGHT = 150; // 图片高度 public static void main(String[] args) throws Exception { String eanCode = "9780201310054"; // 需要生成的EAN-13编号 Map<EncodeHintType, Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); BitMatrix bitMatrix = new MultiFormatWriter().encode(eanCode, BarcodeFormat.EAN_13, WIDTH, HEIGHT, hints); File outputFile = new File("EAN13.png"); writeToFile(bitMatrix, "png", outputFile); } private static void writeToFile(BitMatrix matrix, String format, File file) throws IOException { BufferedImage image = toBufferedImage(matrix); if (!ImageIO.write(image, format, file)) { throw new IOException("Could not write an image of format " + format + " to " + file); } } private static BufferedImage toBufferedImage(BitMatrix matrix) { int width = matrix.getWidth(); int height = matrix.getHeight(); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, matrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB()); } } return image; } } ``` 这段代码定义了一个名为`EAN13Generator`的类,其中包含了用于生成指定尺寸EAN13条形码的方法。通过调用`MultiFormatWriter.encode()`函数传入待编码字符串以及设置参数,即可获得代表条形码图案的二进制矩阵对象(`BitMatrix`)。之后借助辅助方法将其转换成标准图形文件存储下来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值