使用Lua生成Code128条形码数据用于微信支付宝付款码

Posted 合宙Luat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Lua生成Code128条形码数据用于微信支付宝付款码相关的知识,希望对你有一定的参考价值。

上一篇文章我们简单解析了微信、支付宝付款码的条形码生成原理,文章链接如下:

本文将会演示如何使用上篇文章所讲到的条形码数据生成方法,使用Lua语言来生成相关的数据。



1



本文为了方便描述,同样使用b代表一条黑色像素宽度的线,s代表一条白色像素宽度的线,当bs组合时,中间不留任何缝隙。


首先我们先制作几个函数,来生成bs字符串,以便后期生成条形码。

先声明我们需要用到的数据,编码格式如下:

  
    
    
  
  1. local codes = {}

  2. local codeStartC = "bbsbssbbbss" --C

  3. codes[0+1] = "bbsbbssbbss"

  4. codes[1+1] = "bbssbbsbbss"

  5. codes[2+1] = "bbssbbssbbs"

  6. codes[3+1] = "bssbssbbsss"

  7. codes[4+1] = "bssbsssbbss"

  8. codes[5+1] = "bsssbssbbss"

  9. codes[6+1] = "bssbbssbsss"

  10. codes[7+1] = "bssbbsssbss"

  11. codes[8+1] = "bsssbbssbss"

  12. codes[9+1] = "bbssbssbsss"

  13. codes[10+1] = "bbssbsssbss"

  14. codes[11+1] = "bbsssbssbss"

  15. codes[12+1] = "bsbbssbbbss"

  16. codes[13+1] = "bssbbsbbbss"

  17. codes[14+1] = "bssbbssbbbs"

  18. codes[15+1] = "bsbbbssbbss"

  19. codes[16+1] = "bssbbbsbbss"

  20. codes[17+1] = "bssbbbssbbs"

  21. codes[18+1] = "bbssbbbssbs"

  22. codes[19+1] = "bbssbsbbbss"

  23. codes[20+1] = "bbssbssbbbs"

  24. codes[21+1] = "bbsbbbssbss"

  25. codes[22+1] = "bbssbbbsbss"

  26. codes[23+1] = "bbbsbbsbbbs"

  27. codes[24+1] = "bbbsbssbbss"

  28. codes[25+1] = "bbbssbsbbss"

  29. codes[26+1] = "bbbssbssbbs"

  30. codes[27+1] = "bbbsbbssbss"

  31. codes[28+1] = "bbbssbbsbss"

  32. codes[29+1] = "bbbssbbssbs"

  33. codes[30+1] = "bbsbbsbbsss"

  34. codes[31+1] = "bbsbbsssbbs"

  35. codes[32+1] = "bbsssbbsbbs"

  36. codes[33+1] = "bsbsssbbsss"

  37. codes[34+1] = "bsssbsbbsss"

  38. codes[35+1] = "bsssbsssbbs"

  39. codes[36+1] = "bsbbsssbsss"

  40. codes[37+1] = "bsssbbsbsss"

  41. codes[38+1] = "bsssbbsssbs"

  42. codes[39+1] = "bbsbsssbsss"

  43. codes[40+1] = "bbsssbsbsss"

  44. codes[41+1] = "bbsssbsssbs"

  45. codes[42+1] = "bsbbsbbbsss"

  46. codes[43+1] = "bsbbsssbbbs"

  47. codes[44+1] = "bsssbbsbbbs"

  48. codes[45+1] = "bsbbbsbbsss"

  49. codes[46+1] = "bsbbbsssbbs"

  50. codes[47+1] = "bsssbbbsbbs"

  51. codes[48+1] = "bbbsbbbsbbs"

  52. codes[49+1] = "bbsbsssbbbs"

  53. codes[50+1] = "bbsssbsbbbs"

  54. codes[51+1] = "bbsbbbsbsss"

  55. codes[52+1] = "bbsbbbsssbs"

  56. codes[53+1] = "bbsbbbsbbbs"

  57. codes[54+1] = "bbbsbsbbsss"

  58. codes[55+1] = "bbbsbsssbbs"

  59. codes[56+1] = "bbbsssbsbbs"

  60. codes[57+1] = "bbbsbbsbsss"

  61. codes[58+1] = "bbbsbbsssbs"

  62. codes[59+1] = "bbbsssbbsbs"

  63. codes[60+1] = "bbbsbbbbsbs"

  64. codes[61+1] = "bbssbssssbs"

  65. codes[62+1] = "bbbbsssbsbs"

  66. codes[63+1] = "bsbssbbssss"

  67. codes[64+1] = "bsbssssbbss"

  68. codes[65+1] = "bssbsbbssss"

  69. codes[66+1] = "bssbssssbbs"

  70. codes[67+1] = "bssssbsbbss"

  71. codes[68+1] = "bssssbssbbs"

  72. codes[69+1] = "bsbbssbssss"

  73. codes[70+1] = "bsbbssssbss"

  74. codes[71+1] = "bssbbsbssss"

  75. codes[72+1] = "bssbbssssbs"

  76. codes[73+1] = "bssssbbsbss"

  77. codes[74+1] = "bssssbbssbs"

  78. codes[75+1] = "bbssssbssbs"

  79. codes[76+1] = "bbssbsbssss"

  80. codes[77+1] = "bbbbsbbbsbs"

  81. codes[78+1] = "bbssssbsbss"

  82. codes[79+1] = "bsssbbbbsbs"

  83. codes[80+1] = "bsbssbbbbss"

  84. codes[81+1] = "bssbsbbbbss"

  85. codes[82+1] = "bssbssbbbbs"

  86. codes[83+1] = "bsbbbbssbss"

  87. codes[84+1] = "bssbbbbsbss"

  88. codes[85+1] = "bssbbbbssbs"

  89. codes[86+1] = "bbbbsbssbss"

  90. codes[87+1] = "bbbbssbsbss"

  91. codes[88+1] = "bbbbssbssbs"

  92. codes[89+1] = "bbsbbsbbbbs"

  93. codes[90+1] = "bbsbbbbsbbs"

  94. codes[91+1] = "bbbbsbbsbbs"

  95. codes[92+1] = "bsbsbbbbsss"

  96. codes[93+1] = "bsbsssbbbbs"

  97. codes[94+1] = "bsssbsbbbbs"

  98. codes[95+1] = "bsbbbbsbsss"

  99. codes[96+1] = "bsbbbbsssbs"

  100. codes[97+1] = "bbbbsbsbsss"

  101. codes[98+1] = "bbbbsbsssbs"

  102. codes[99+1] = "bsbbbsbbbbs"

  103. codes[100+1] = "bsbbbbsbbbs"

  104. codes[101+1] = "bbbsbsbbbbs"

  105. codes[102+1] = "bbbbsbsbbbs"

  106. codes[103+1] = "bbsbssssbss"--codeStartA

  107. codes[104+1] = "bbsbssbssss"--codeStartB

  108. codes[106+1] = "bbsssbbbsbsbb"  --end



2


按C条形码生成规则,处理偶数长度的字符串:

  
    
    
  
  1. --生成code128C字符串

  2. local function makeCode128C(s)

  3.    if s:len() % 2 == 1 then

  4.        log.warn("barcode.makeCode128C","code not right")

  5.        return

  6.    end

  7.    local codeTemp = {}

  8.    for i=1,s:len()/2 do

  9.        table.insert(codeTemp,s:sub(i*2-1,i*2))

  10.    end

  11.    local check = 105

  12.    for i=1,#codeTemp do

  13.        check = check + i * codeTemp[i]

  14.    end

  15.    check = check % 103

  16.    local result = codeStartC

  17.    for i=1,#codeTemp do

  18.        result = result..codes[codeTemp[i]+1]

  19.    end

  20.    result = result..codes[check+1]..codes[106+1]

  21.    log.info("barcode.makeCode128C",result)

  22.    return result

  23. end



3


当出现奇数长度字符串时,按C+A拼接生成条形码,并且加入判断,字符串长度为偶数时,使用上面的函数处理:

  
    
    
  
  1. --生成code128C+A混合字符串,如长度为偶数,只生成C类型条码

  2. local function makeCode128(s)

  3.    if s:len() == 0 or s == nil then

  4.        return

  5.    end

  6.    if s:len() % 2 == 0 then

  7.        return makeCode128C(s)

  8.    end

  9.    local codeTemp = {}

  10.    for i=1,s:len()/2 do

  11.        table.insert(codeTemp,s:sub(i*2-1,i*2))

  12.    end

  13.    local other = tonumber(s:sub(s:len())) + 16

  14.    table.insert(codeTemp,101)

  15.    table.insert(codeTemp,other)

  16.    local check = 105

  17.    for i=1,#codeTemp do

  18.        check = check + i * codeTemp[i]

  19.    end

  20.    check = check % 103

  21.    local result = codeStartC

  22.    for i=1,#codeTemp do

  23.        result = result..codes[codeTemp[i]+1]

  24.    end

  25.    result = result..codes[check+1]..codes[106+1]

  26.    log.info("barcode.makeCode128C+A",result)

  27.    return result

  28. end

这样,我们就可以得到类似于bsbbsbsbbbbbsbbbs...这样的一串字符串了。



4


接下来要实现显示功能,这里用到了合宙Luat的disp库:

  
    
    
  
  1. --- code128 c型条形码显示函数,横向显示

  2. -- @string s,需要显示的字符串,必须为数字,字符个数为偶数个

  3. -- @number x,显示的初始x坐标

  4. -- @number y,显示的初始y坐标

  5. -- @number height,显示的二维码高度

  6. -- @return nil

  7. -- @usage

  8. -- showCode128CX("12345678",0,0,20)

  9. function showCode128CX(s,x,y,height)

  10.    local codeTemp = makeCode128(s)

  11.    if not codeTemp then return end

  12.    for i=1,codeTemp:len() do

  13.        if codeTemp:sub(i,i) == "b" then

  14.            disp.drawrect(x+i-1,y,x+i-1,y+height,0x0000)

  15.        elseif codeTemp:sub(i,i) == "s" then

  16.            disp.drawrect(x+i-1,y,x+i-1,y+height,0xffff)

  17.        end

  18.    end

  19. end

  20. --- code128 c型条形码显示函数,竖向显示

  21. -- @string s,需要显示的字符串,必须为数字,字符个数为偶数个

  22. -- @number x,显示的初始x坐标

  23. -- @number y,显示的初始y坐标

  24. -- @number width,显示的二维码高度

  25. -- @return nil

  26. -- @usage

  27. -- showCode128CY("12345678",0,0,20)

  28. -- barcode.showCode128CY("123412341234123456",10,10,40)

  29. function showCode128CY(s,x,y,width)

  30.    local codeTemp = makeCode128(s)

  31.    if not codeTemp then return end

  32.    for i=1,codeTemp:len() do

  33.        if codeTemp:sub(i,i) == "b" then

  34.            disp.drawrect(x,y+i-1,x+width,y+i-1,0x0000)

  35.        elseif codeTemp:sub(i,i) == "s" then

  36.            disp.drawrect(x,y+i-1,x+width,y+i-1,0xffff)

  37.        end

  38.    end

  39. end


5


为了方便,再加上一个显示数字的功能,字体需要按自己需求来准备:

  
    
    
  
  1. --摆放横向数字

  2. function placeNumber(s,x,y)

  3.    local oldFont = disp.setfont(disp.font_12x6)

  4.    for i=1,s:len() do

  5.        disp.puttext(s:sub(i,i),x,y-(i-1)*6)

  6.    end

  7.    disp.setfont(oldFont)

  8. end


最终效果如下:


使用Lua生成Code128条形码数据【用于微信、支付宝付款码】


END

以上就是使用Lua来生成条形码显示到屏幕上的操作过程,你学会了吗,赶快试试吧~如有任何建议欢迎留言互动。
合宙商城福利大放送,下单有惊喜,没有参与的同学不要错过哦!


使用Lua生成Code128条形码数据【用于微信、支付宝付款码】



使用Lua生成Code128条形码数据【用于微信、支付宝付款码】



更多福利,敬请期待


使用Lua生成Code128条形码数据【用于微信、支付宝付款码】




Luat相关教程文章:


Luat小企业系列原创文章:

合宙Luat将陆续推出小企业系列原创作品,敬请关注!




 ▼
Luat热文推荐





以上是关于使用Lua生成Code128条形码数据用于微信支付宝付款码的主要内容,如果未能解决你的问题,请参考以下文章

怎样用code128条码制作器获得电能表二维码

code128条形码的开始停止字符是啥

什么会导致从 netbarcodewriter 库生成的 Code128 条码无法扫描?

代表相同数据的不同 Code 128 条码符号

在 Java 中生成更小的 code-128 条码

java识别条形码api都有哪些