我使用libqrencode将字节数组编码为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])<<", ";
我得到了以下结果:
111, 127, 194, 128, 195, 160, 195, 191, 194, 178, 195, 137, 195, 136, 195, 128, 194, 191, 22, 17, 20, 34, 65, 23, 76,
因此,我们可以注意到值&lt; 128没有影响,但我为每个值&gt; = 128得到两个字节。 我还打印了值而不转换为unsigned char:
for(int k=0; k< 25; k++)
cout<< (int)input_data[k]<<", ";
结果是:
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]);
}
}
}
有人可以帮我解决这个问题并解释为什么我会得到这些额外的字节吗?