📄 qrcode.rb
字号:
#!/usr/local/bin/ruby## QRcode class library for ruby version 0.50beta6 (c)2002-2004 Y.Swetake##class Qrcodedef initialize @path="./qrcode_data" @qrcode_error_correct="M" @qrcode_version=0 @qrcode_structureappend_n=0 @qrcode_structureappend_m=0 @qrcode_structureappend_parity="" @qrcode_structureappend_originaldata=""enddef string_bit_cal(s1,s2,ind)p "s1 : "p s1.unpack("C*") if s1.length>s2.length then s3=s1 s1=s2 s2=s3 end i=0 res="" left_length=s2.length-s1.length case ind when "xor" s1.each_byte{|b| res+=(b ^ s2[i]).chr i+=1 } res+=s2[s1.length,left_length] when "or" s1.each_byte{|b| res+=(b | s2[i]).chr i+=1 } res+=s2[s1.length,left_length] when "and" s1.each_byte{|b| res+=(b & s2[i]).chr i+=1 } res+=0.chr * left_length end#p res.unpack("C*");#exit; return(res)enddef string_bit_not(s1) res="" s1.each_byte{|b| res+=(256 + ~b).chr} return(res)enddef set_qrcode_version(z) if (z>=0 && z<=40) then @qrcode_version=z endenddef set_qrcode_error_correct(z) @qrcode_error_correct=zenddef get_qrcode_version() return @qrcode_versionenddef set_structureappend(m,n,p) if (n>1 && n<=16 && m>0 && m<=16 && p>=0 && p<=255) then @qrcode_structureappend_m=m @qrcode_structureappend_n=n @qrcode_structureappend_parity=p endenddef cal_structureappend_parity(originaldata) if (originaldata.length>1) then structureappend_parity=0 originaldata.each_byte{|b| structureappend_parity^=b} return structureappend_parity endenddef make_qrcode(qrcode_data_string) data_length=qrcode_data_string.length if (data_length<=0) then raise "Data do not exist" return 0 end data_counter=0 data_value=Array.new data_bits=Array.new if (@qrcode_structureappend_n > 1) then data_value[0]=3 data_bits[0]=4 data_value[1]=@qrcode_structureappend_m-1 data_bits[1]=4 data_value[2]=@qrcode_structureappend_n-1 data_bits[2]=4 data_value[3]=@qrcode_structureappend_parity data_bits[3]=8 data_counter=4 end data_bits[data_counter]=4# --- determine encode mode if (qrcode_data_string[/[^0-9]/]) then if (qrcode_data_string[/[^0-9A-Z \$\*\%\+\-\.\/\:]/]) then# --- 8bit byte mode #p qrcode_data_string.unpack("H*")#exit codeword_num_plus=Array[0,0,0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] data_value[data_counter]=4 data_counter+=1 data_value[data_counter]=data_length data_bits[data_counter]=8 codeword_num_counter_value=data_counter data_counter+=1 i=0 while i<data_length data_value[data_counter]=qrcode_data_string[i] data_bits[data_counter]=8 data_counter+=1 i+=1 endp data_valueexit else# ---- alphanumeric mode codeword_num_plus=Array[0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4] data_value[data_counter]=2 data_counter+=1 data_value[data_counter]=data_length data_bits[data_counter]=9 codeword_num_counter_value=data_counter alphanumeric_character_hash=Hash["0"=>0,"1"=>1,"2"=>2,"3"=>3,"4"=>4,"5"=>5,"6"=>6,"7"=>7,"8"=>8,"9"=>9,"A"=>10,"B"=>11,"C"=>12,"D"=>13,"E"=>14,"F"=>15,"G"=>16,"H"=>17,"I"=>18,"J"=>19,"K"=>20,"L"=>21,"M"=>22,"N"=>23,"O"=>24,"P"=>25,"Q"=>26,"R"=>27,"S"=>28,"T"=>29,"U"=>30,"V"=>31,"W"=>32,"X"=>33,"Y"=>34,"Z"=>35," "=>36,"\$"=>37,"\%"=>38,"\*"=>39,"\+"=>40,"\-"=>41,"\."=>42,"\/"=>43,"\:"=>44] i=0 data_counter+=1 while i<data_length if (i % 2) ==0 then data_value[data_counter]=alphanumeric_character_hash[qrcode_data_string[i,1]] data_bits[data_counter]=6 else data_value[data_counter]=data_value[data_counter]*45+alphanumeric_character_hash[qrcode_data_string[i,1]] data_bits[data_counter]=11 data_counter+=1 end i+=1 end end else# ---- numeric mode codeword_num_plus=Array[0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4] data_value[data_counter]=1 data_counter+=1 data_value[data_counter]=data_length data_bits[data_counter]=10 codeword_num_counter_value=data_counter i=0 data_counter+=1 while i<data_length if ((i % 3)==0) then data_value[data_counter]=qrcode_data_string[i,1].to_i data_bits[data_counter]=4 else data_value[data_counter]=data_value[data_counter]*10+qrcode_data_string[i,1].to_i if ((i % 3)==1) then data_bits[data_counter]=7 else data_bits[data_counter]=10 data_counter+=1 end end i+=1 end end if data_bits[data_counter].nil? then elsif data_bits[data_counter]>0 then data_counter+=1 end i=0 total_data_bits=0 while i<data_counter total_data_bits+=data_bits[i] i+=1 end ecc_character_hash=Hash["L"=>1,"l"=>1,"M"=>0,"m"=>0,"Q"=>3,"q"=>3,"H"=>2,"h"=>2] ec=ecc_character_hash[@qrcode_error_correct] ec=0 if (!ec) max_data_bits_array=Array[0,128,224,352,512,688,864,992,1232,1456,1728,2032,2320,2672,2920,3320,3624,4056,4504,5016,5352,5712,6256,6880,7312,8000,8496,9024,9544,10136,10984,11640,12328,13048,13800,14496,15312,15936,16816,17728,18672,152,272,440,640,864,1088,1248,1552,1856,2192,2592,2960,3424,3688,4184,4712,5176,5768,6360,6888,7456,8048,8752,9392,10208,10960,11744,12248,13048,13880,14744,15640,16568,17528,18448,19472,20528,21616,22496,23648,72,128,208,288,368,480,528,688,800,976,1120,1264,1440,1576,1784,2024,2264,2504,2728,3080,3248,3536,3712,4112,4304,4768,5024,5288,5608,5960,6344,6760,7208,7688,7888,8432,8768,9136,9776,10208,104,176,272,384,496,608,704,880,1056,1232,1440,1648,1952,2088,2360,2600,2936,3176,3560,3880,4096,4544,4912,5312,5744,6032,6464,6968,7288,7880,8264,8920,9368,9848,10288,10832,11408,12016,12656,13328] if (@qrcode_version==0) then#--- auto version select i=1+40*ec j=i+39 @qrcode_version=1 while i<=j if ((max_data_bits_array[i])>=total_data_bits+codeword_num_plus[@qrcode_version]) then max_data_bits=max_data_bits_array[i] break end i+=1 @qrcode_version+=1 end else max_data_bits=max_data_bits_array[@qrcode_version+40*ec] end total_data_bits+=codeword_num_plus[@qrcode_version] data_bits[codeword_num_counter_value]+=codeword_num_plus[@qrcode_version] max_codewords_array=Array[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706] max_codewords=max_codewords_array[@qrcode_version] max_modules_1side=17+(@qrcode_version << 2) matrix_remain_bit=Array[0,0,7,7,7,7,7,0,0,0,0,0,0,0,3,3,3,3,3,3,3,4,4,4,4,4,4,4,3,3,3,3,3,3,3,0,0,0,0,0,0]#/* ---- read version ECC data file */ byte_num=matrix_remain_bit[@qrcode_version]+(max_codewords << 3) filename=@path+"/qrv"+@qrcode_version.to_s+"_"+ec.to_s+".dat"p filename fp = File.open(filename ,"rb") matx=fp.read(byte_num) maty=fp.read(byte_num) masks=fp.read(byte_num) fi_x=fp.read(15) fi_y=fp.read(15) rs_ecc_codewords=fp.read(1).unpack("C")[0] rso=fp.read(128) fp.close matrix_x_array=matx.unpack("C*") matrix_y_array=maty.unpack("C*") mask_array=masks.unpack("C*") rs_block_order=rso.unpack("C*") format_information_x2=fi_x.unpack("C*") format_information_y2=fi_y.unpack("C*")p [matrix_x_array,matrix_y_array]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -