Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用zxing实现随机字节数组的编解码_Java_Android_Qr Code_Zxing - Fatal编程技术网

Java 用zxing实现随机字节数组的编解码

Java 用zxing实现随机字节数组的编解码,java,android,qr-code,zxing,Java,Android,Qr Code,Zxing,我试图用二维码传输一个字节数组,所以为了测试,我决定生成一个随机字节数组,将其编码为二维码,然后解码。我使用ISO-8859-1将字节数组转换为字符串s.t。传输时不会丢失数据: 对于编码器侧: byte []buffer = new byte[11]; com.google.zxing.Writer writer = new QRCodeWriter(); Random randomGenerator = new Random(); for(int i=0;i<=10;i++){

我试图用二维码传输一个字节数组,所以为了测试,我决定生成一个随机字节数组,将其编码为二维码,然后解码。我使用ISO-8859-1将字节数组转换为字符串s.t。传输时不会丢失数据:

对于编码器侧:

byte []buffer = new byte[11];
com.google.zxing.Writer writer = new QRCodeWriter();
Random randomGenerator = new Random();
    for(int i=0;i<=10;i++){
        buffer[i]=(byte) randomGenerator.nextInt(254);
    }
   // Log.i("time1","original: "+Arrays.toString(buffer));
    String decoded = null;
    try {
        decoded = new String(buffer, "ISO-8859-1");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        result=writer.encode(decoded, BarcodeFormat.QR_CODE, 500, 500);
    } catch (WriterException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
byte[]buffer=新字节[11];
com.google.zxing.Writer Writer=new QRCodeWriter();
Random randomGenerator=新的Random();

对于(int i=0;i尝试
纯条形码
模式作为检测提示。奇怪的是,当图像只是纯合成图像时,查找模式的误报检测是一个更大的问题。启发式算法假设照片没有这些问题。在这种替代模式下,它可以利用知道它是纯图像而不是pho的优势要更快,并且永远不会检测错误。

在二维码中存储二进制数据时,必须克服两个问题

  • ISO-8859-1不允许在00-1F和7F-9F范围内使用字节。由于您使用的是随机生成器,您只需检查随机生成的字节是否符合此值,然后重新生成,直到获得符合此范围的随机字节。如果 尽管如此,您仍然需要对这些字节进行编码,您可以将数组编码为Base-64字符串或十六进制字符串。对于十六进制字符串,它将以字母数字模式存储在QR码中,而不是以8位模式存储

  • 由于您试图将二进制数据存储在QR码中,因此必须 只能依靠您自己的扫描仪来处理此二进制数据,并且您需要确保扫描仪不会使用启发式自动确定字符编码等。大多数QR解码器使用启发式来检测字符 使用的字符集。这些启发式算法可以检测除 ISO-8859-1,因此无法正确显示二进制数据 扫描仪使用试探法检测字符集,即使 字符集由二维码内的ECI可选扩展名显式提供

  • 因此,仅使用US-ASCII(例如,在将二进制数据传递给QR码生成器之前,使用Base64编码的二进制数据)是针对启发式的QR码最安全的选择。这还将克服另一个复杂问题:ISO-8859-1不是2000年发布的早期QR码标准(ISO/IEC 18004:2000)中的默认编码该标准确实根据JIS X 0201(JIS8也称为ISO-2022-JP)规定了8位拉丁/假名字符集作为8位模式的默认编码,而2005年发布的更新标准确实将默认值更改为ISO-8859-1


    如果您将缓冲区存储为二维码中的十六进制字符串,这将禁用所有试探法,并且不会产生比Base-64更大的二维码,因为字母数字模式中的每个字符在二维码流中仅占6位。

    我使用ISO-8859-1将字节数组转换为字符串,这样在传输时不会丢失数据锡安。对不起,这毫无意义。对不起,混淆了。我的意思是,我可以将随机字节数组转换为字符串,然后再转换回来,我仍然可以得到相同的字节数组。我的更新#2在一条消息中显示了您所说的详细信息。您没有发布任何失败的QR码。有什么问题吗?您是否生成了随机字节数组就像我的更新2一样,它肯定会失败。但是如果我只键入一个字符串并进行编码,它工作得很好。这已经正确解码了。但是尝试纯条形码模式谢谢,notfoundexception消失了。但是现在解码器出现formatexception,你能告诉我为什么吗?我的解码器现在和我的更新7一样,图像仍然是我看到的屏幕截图张贴。现在我的问题是什么样的解码提示组合可以成功解码此图像?谢谢我尝试了所有可能的提示组合,但仍然抛出notfound和checksum异常:(我自己解决了这个问题,我在解码过程前不小心篡改了YUV数据,很抱歉给您带来麻烦。
    LuminanceSource source = new PlanarYUVLuminanceSource(data,640,480,0,0,640,480,false);
    bmtobedecoded = new BinaryBitmap(new HybridBinarizer(source));
    Map<DecodeHintType,Object> mp=new HashMap<DecodeHintType, Object>();
    
    mp.put(DecodeHintType.TRY_HARDER, true);
    try {
        result= qrr.decode(bmtobedecoded,mp);
    } catch (NotFoundException e) {
        Log.i("123","not found");
        e.printStackTrace();
    } catch (ChecksumException e) {
        Log.i("123","checksum");
        e.printStackTrace();
    } catch (FormatException e) {
        Log.i("123","format");
        e.printStackTrace();
    }
    
    Random randomGenerator = new Random();
    for(int i=0;i<=10;i++){
        buffer[i]=(byte) randomGenerator.nextInt(254);
    }
    Log.i("time1","original: "+Arrays.toString(buffer));
    String decoded = null;
    try {
        decoded = new String(buffer, "ISO-8859-1");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Log.i("time1","encoded string:" + decoded);
    BitMatrix result=null;
    try {
        result=qw.encode(decoded, BarcodeFormat.QR_CODE, 500, 500);
    } catch (WriterException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    iv.setImageBitmap(encodematrix(result));
    byte[] encoded = null;
    try {
        encoded = decoded.getBytes("ISO-8859-1");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    Log.i("time1","result byte array:" + java.util.Arrays.toString(encoded));
    
    Map<DecodeHintType,Object> mp=new HashMap<DecodeHintType, Object>();
    mp.put(DecodeHintType.CHARACTER_SET, "ISO-8859-1");