Go解析QR并转为TLV字符串

Go解析base64格式的二维码图片,并转为TLV字符串。

如果二维码是jpg/png文件,可直接读本地文件获取img对象。

示例

package main

import (
	"bytes"
	"encoding/base64"
	"fmt"
	"image/png"

	"github.com/makiuchi-d/gozxing"
	"github.com/makiuchi-d/gozxing/qrcode"
)

func recognizeQr(qr string) {
	qrImg, err := base64.StdEncoding.DecodeString(qr)
	if err != nil {
		panic("Cannot decode base64")
	}
	r := bytes.NewReader(qrImg)
	img, err := png.Decode(r)
	if err != nil {
		panic("Cannot decode png")
	}
	bmp, _ := gozxing.NewBinaryBitmapFromImage(img)

	// decode image
	qrReader := qrcode.NewQRCodeReader()
	result, _ := qrReader.Decode(bmp, nil)
	fmt.Println(result)
}

func main() {
	recognizeQr("iVBORw0KGgoAAAANSUhEUgAAAIAAAACAAQMAAAD58POIAAAABlBMVEX///8AAABVwtN+AAACU0lEQVR42tTSsY3mKhQFYEhMC5cEWjOJaQESAwluARLTGiS4BUjM0/warfRm7hawJ/wkW9yjQ/7lyBV5e3LInYc1MABa5lWJe/nTPGDAZ/C88tCiUCXhEHV7ibuFzH+DMlso08sQcADqBdGJP96G73f8ALnyn3zf8gO+ItiQXXfzp4L/Ac9eXq+cocoKOwYbAXGSU3fbaUeBzdetaJMLucyEAb0J6+LYVDzIuWMgXLldtbmCXRUwoP0AvvphZyVuYED08gdfud2CZxTY2E/eya7as6rBQOg188tfPqNQAwMCZCP7qUJb0aEAMrTQWSlVlVwx4Ldaa12vOQihAwOgQ8UN7DNDsijIF+iMuu96DuYx4C23fMN+Mi9DwoBsdL2nnFXYbj0GtLxATjlAGDl2DPgAWyKAbTMJg4GwJRFjc7llvgkKIMwmADY3QOwoyLluVmZpoXxK/wW8gxDgSjwP3SoG7AmV+a/jr++d/oTt4F4cLA9dQXkU1JV4eQlNxHzm8AtkIsaVTmc1RHsM6CxDCD6fSFgYGADokI5D+699Ggw2OnZ1qxKGDdfAQEbWVTx2oe/z88kvIMxvqnUih55px4C+rg0g5jwPNSsKqzyJ5tC8SmZHobsb4NDvrqMgGAjnaW7p5NE+CQXmzelKN3LIaisGRL0gvmYJdi0cCGzSA6jXJTAYyBVWe3me3ubsMQB6Ne8GqJuNz7R/AZ83S5uct7rKpyAEItmOTT7zKuEvcNu0gUxEmAMwABoS8zrqyD///A1ylavbKluE3QAG/2z+CwAA//+3BLtVXLXAxAAAAABJRU5ErkJggg==")
}

JS parse TLV

var qris = '00020101021226680016ID.CO.TELKOM.WWW011893600898025599662702150001952559966270303UMI51440014ID.CO.QRIS.WWW0215ID10200211817450303UMI520457325303360540825578.005502015802ID5916InterActive Corp6013KOTA SURABAYA61056013662130509413255111630439B7'

var tags = [];

var i = 0;
while (i < qris.length) {
    var tag = qris.substring(i, i + 2);
    i += 2;
    var valueLength = Number(qris.substring(i, i + 2));
    i += 2;
    var value = qris.substring(i, i + valueLength);
    i += valueLength;
    tags.push({tag: tag, length: valueLength, value: value});
}

console.log(tags)