“索引超出了數組界限”也有可能確實是因為你選擇的二維碼Version對應的容量不足以存儲你所放的內容,如果你確定使用的版本容量二維碼能存儲你的內容,但還是報錯,那么再考慮此解決方法
這兩天忙着做一個客戶標簽打印程序,因為二維碼里面存在控制符,使用ZPL指令存在一些問題,因此決定使用生成二維碼圖片然后轉換成ZPL格式圖片來打印。途中找了很多類庫,很多都無法自定義QR的version而放棄,轉而找到ThoughtWorks.QRCode.dll,效果很滿意,但是測試的時候發現經常會提示“索引超出了數組界限”異常,開始以為是內容太多的原因。測試多種version都不湊效,我使用的是version=10,而該版本最高可容納213個字節,實際內容卻只有100多個字節。然后網上各種找答案,要么說設置為0(0是QR自動大小)這樣我使用該類庫就沒有意義了,而且使用此方法也測試過,依然報錯。
然后我開始找ThoughtWorks.QRCode的源碼,使用源碼一行一行調試,結果發現使用源碼自帶的demo程序,設置與我程序一樣的version,放一樣的內容,竟然沒有報錯,此時我肯定了不是因為二維碼容量導致的。
接着我開始兩個程序同步調試,一行一行觀察兩個程序運行時源碼QRCodeEncoder.cs中每個數值是否相同,最后在我的程序在源碼第448行處發現報了異常,源碼demo卻沒有。查看代碼,此處在讀某個文件,
然后發現在源碼demo程序生成文件夾中有這么一個文件夾(下圖),按448行的理解,此文件夾中應該存儲的是QR對應的Version的數據文件,用於計算二維碼容量,而我的程序沒有此文件夾計算結果為0,后續計算自然會報“索引超出了數組界限”異常。
把此文件夾復制到程序中,問題解決,不再報此異常。最后附上Demo源碼!
附件:點擊下載