C++ 基于zbar的QR译码

C++ 基于zbar的QR译码,c++,qr-code,zbar,C++,Qr Code,Zbar,我正在使用libqrcode将一个字节数组编码为qr码,然后尝试使用zbar库对其进行解码。程序设计语言是C++。 当值>=128时会出现问题。例如,当我解码包含以下值的qr码时: unsigned char data[17]={111, 127, 128, 224, 255, 178, 201,200, 192, 191,22, 17,20, 34, 65 ,23, 76}; symbol->get_data_length()返回25而不是17,当我尝试使用这段小代码打印值时: st

我正在使用libqrcode将一个字节数组编码为qr码,然后尝试使用zbar库对其进行解码。程序设计语言是C++。 当值>=128时会出现问题。例如,当我解码包含以下值的qr码时:

unsigned char  data[17]={111, 127, 128, 224, 255, 178, 201,200, 192, 191,22, 17,20, 34, 65 ,23, 76};   
symbol->get_data_length()
返回25而不是17,当我尝试使用这段小代码打印值时:

string input_data = symbol->get_data();
for(int k=0; k< 25; k++)
   cout<< (int)((unsigned char)input_data[k])<<", "; 
我们可以注意到,<128的值没有影响,但是我得到了两个字节,每个值>=128。 我还打印了值,但没有强制转换为无符号字符:

for(int k=0; k< 25; k++)
   cout<< (int)input_data[k]<<", ";
我通过以下代码解决此问题:

void process_zbar_output(const string & input_data, vector<unsigned char> & output_data)
    {
        for (int i = 0; i < input_data.length(); i++)
        {
            int temp = (int) input_data[i];
 // if the original value is >=128 we need to process it to get the original value
            if (temp < 0)
            {
                // if the number is 62 than the original is between 128 and 191
                // if the number is 61 than the original is between 192 and 255
                if (temp == -62)
                    output_data.push_back(256 + ((int) input_data[i + 1]));
                else
                    output_data.push_back(256 + ((int) input_data[i + 1] + 64));
                i++;

            }
            else
            {
                output_data.push_back( input_data[i]);
            }
        }
    }
void进程输出(常量字符串和输入数据、向量和输出数据)
{
对于(int i=0;i=128,我们需要对其进行处理以获得原始值
如果(温度<0)
{
//如果数字为62,则原始数字介于128和191之间
//如果数字为61,则原始数字介于192和255之间
如果(温度==-62)
输出数据。向后推(256+((int)输入数据[i+1]);
其他的
输出数据。推回(256+((int)输入数据[i+1]+64));
i++;
}
其他的
{
输出数据。推回(输入数据[i]);
}
}
}

有人能帮我解决这个问题并解释一下为什么我会有这些额外的字节吗?

我不确定在中读取这些字节时发生了什么,我不熟悉这些库。但是为了把它们打印出来。。。194是11000010,二进制是-62加上2的补码。。。因此,这将引导您在第二期的正确方向。是的,这是两者的补充。但问题是,解码值是(194,128,当转换到uchar时)或(-62,-128,不转换到uchar时)而不是128。因此,我使用函数“processzbar_output”中的值(-62,-128)来获得原始值。此外,我可以从第二个分量(194128)得到[128..191]范围内的原始值,这对于这个范围内的所有值都是正确的。但对于[192..255]范围内的值,情况并非如此。我不确定在中读取它们时会发生什么,我不熟悉这些库。但是为了把它们打印出来。。。194是11000010,二进制是-62加上2的补码。。。因此,这将引导您在第二期的正确方向。是的,这是两者的补充。但问题是,解码值是(194,128,当转换到uchar时)或(-62,-128,不转换到uchar时)而不是128。因此,我使用函数“processzbar_output”中的值(-62,-128)来获得原始值。此外,我可以从第二个分量(194128)得到[128..191]范围内的原始值,这对于这个范围内的所有值都是正确的。但对于[192..255]范围内的值,情况并非如此。我不确定在中读取它们时会发生什么,我不熟悉这些库。但是为了把它们打印出来。。。194是11000010,二进制是-62加上2的补码。。。因此,这将引导您在第二期的正确方向。是的,这是两者的补充。但问题是,解码值是(194,128,当转换到uchar时)或(-62,-128,不转换到uchar时)而不是128。因此,我使用函数“processzbar_output”中的值(-62,-128)来获得原始值。此外,我可以从第二个分量(194128)得到[128..191]范围内的原始值,这对于这个范围内的所有值都是正确的。但对于[192..255]范围内的值,情况并非如此。
111, 127, -62, -128, -61, -96, -61, -65, -62, -78, -61, -119, -61, -120, -61, -128, -62, -65, 22, 17, 20, 34, 65, 23, 76
void process_zbar_output(const string & input_data, vector<unsigned char> & output_data)
    {
        for (int i = 0; i < input_data.length(); i++)
        {
            int temp = (int) input_data[i];
 // if the original value is >=128 we need to process it to get the original value
            if (temp < 0)
            {
                // if the number is 62 than the original is between 128 and 191
                // if the number is 61 than the original is between 192 and 255
                if (temp == -62)
                    output_data.push_back(256 + ((int) input_data[i + 1]));
                else
                    output_data.push_back(256 + ((int) input_data[i + 1] + 64));
                i++;

            }
            else
            {
                output_data.push_back( input_data[i]);
            }
        }
    }