微光互聯 TX800-U 掃碼器無法輸出中文到光標的問題( 二 )


微光互聯 TX800-U 掃碼器無法輸出中文到光標的問題

文章插圖
表示連接掃碼器成功,分別掃描車架號和車牌號:
vbar_open success!開始解碼:二維碼長度:18LFV3A23C083027701二維碼長度:10浜琈D0926車架號是正常的,而車牌號果然是亂碼 。
找到 Demohidprotocol 源碼 (USB接口C-CPP語言SDK20220411\USB接口C&CPP語言SDK20220411\Demohidprotocal\Demohidprotocal\main.cpp):
#include "channel.h"#include <stdio.h>#include <windows.h>#include <string.h>struct vbar_channel *dev;/*背光燈開關控制  state為1時打開補光燈,為0時關閉補光燈*/void lightswitch(int state){ unsigned char buf[1025] = { 0 }; if (state == 1) {buf[0] = 0x55;buf[1] = 0xAA;buf[2] = 0x24;buf[3] = 0x01;buf[4] = 0x00;buf[5] = 0x01;buf[6] = 0xDB;vbar_channel_send(dev, buf, 1024); } else {buf[0] = 0x55;buf[1] = 0xAA;buf[2] = 0x24;buf[3] = 0x01;buf[4] = 0x00;buf[5] = 0x00;buf[6] = 0xDA;vbar_channel_send(dev, buf, 1024); }}/*掃碼開關控制 state為1時打開掃碼 , 為0時關閉掃碼*/void scanswitch(int state){ unsigned char buf[1025] = {0}; if (state == 1) {buf[0] = 0x55;buf[1] = 0xAA;buf[2] = 0x05;buf[3] = 0x01;buf[4] = 0x00;buf[5] = 0x00;buf[6] = 0xfb;vbar_channel_send(dev, buf, 1024); } else {buf[0] = 0x55;buf[1] = 0xAA;buf[2] = 0x05;buf[3] = 0x01;buf[4] = 0x00;buf[5] = 0x01;buf[6] = 0xfa;vbar_channel_send(dev, buf, 1024); }}int main() { dev = vbar_channel_open(1, 1); if (!dev) {printf("open dev fail!\n");return -1; } else {printf("open dev success!\n"); } printf("開始解碼:\r\n"); scanswitch(1); //接收掃碼 unsigned char bufresult[1024] = {0}; unsigned char bufferrecv_1[1024] = {0}; unsigned char readBuffers[2048] = {0}; while (1) {if (vbar_channel_recv(dev, bufresult, 1024, 200) > 0){if (bufresult[0] == 0x55 && bufresult[1] == 0xAA && bufresult[2] == 0x30){int datalen = bufresult[4] + (bufresult[5] << 8);if (datalen <= 1017){for (int s1 = 0; s1 < datalen; s1++){readBuffers[s1] = bufresult[6 + s1];}}if (1017 < datalen && datalen <= 2041){for (int s1 = 0; s1 < 1018; s1++){readBuffers[s1] = bufresult[6 + s1];}vbar_channel_recv(dev, bufferrecv_1, 1024, 200);for (int s2 = 0; s2 < datalen + 7 - 1025; s2++){readBuffers[s2 + 1018] = bufferrecv_1[s2];}}printf("二維碼長度:%d\n", datalen);readBuffers[datalen + 7] = '\0';printf("%.*s\n", datalen, readBuffers);}} }}謎之編碼風格,另外這接口設計的也有點凌亂,程序中出現了好多魔數:1017/1018/2041/200/7,看著頭大 。所幸讀取的數據位于 readBuffers 緩沖中,只要對它做個編碼轉換就 OK 啦 。
編碼轉換windows 中文版編碼一般是 gb2312,漢字源編碼則可能是 utf-8,為了驗證這一點,搬出來了 iconv:
$ echo "浜琈D0926" | iconv -f 'utf-8' -t 'cp936'京MD0926看來確實如此,注意這里使用 cp936 而不是  gb2312 作為 iconv 的第二個參數 。如果沒有 iconv,也有許多線上的編碼轉換工具可用:
微光互聯 TX800-U 掃碼器無法輸出中文到光標的問題

文章插圖
確定了字符集轉換方向,直接從網上搜羅來一些現成的實現:
std::wstring utf8_to_unicode(std::string const& utf8){    int need = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);    if (need > 0)    {        std::wstring unicode;        unicode.resize(need);        MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, &unicode[0], need);        return unicode;    }    return std::wstring();}std::string unicode_to_gb2312(std::wstring const& unicode){    int need = WideCharToMultiByte(936, 0, unicode.c_str(), -1, NULL, 0, NULL, NULL);    if (need > 0)    {        std::string gb2312;        gb2312.resize(need);        WideCharToMultiByte(936, 0, unicode.c_str(), -1, &gb2312[0], need, 0, 0);        return gb2312;    }    return std::string();}std::string utf8_to_gb2312(std::string const& utf8){    std::wstring unicode = utf8_to_unicode(utf8);    return unicode_to_gb2312(unicode);}

推薦閱讀