微信扫一扫的扫码功能是本地实现还是联网实现的?

微信扫一扫的扫码功能很弱,速度慢,经常有二维码识别不了。Dynamsoft的同事怀疑微信的扫码不是在本地完成的,而是把数据传输到了server端来解码。如何才能得到答案?

微信扫一扫网速检测

为什么会有人怀疑微信的扫码是需要连接server的,原因在于在断网的情况下,微信扫描是不可用的。那么在联网的情况下怎么可以知道数据传输了没有?我在手机上打开状态栏网速显示。

数值很小,不可能有图像数据传输。扫码应该是本地完成的。再进一步验证下。

窥探微信安装包

手机应用的安装包其实就是一个压缩包,用7zip解压,打开目录lib\armeabi。里面包涵了微信安卓应用所用到的C/C++动态链接库。

大概扫一下,看到了libwechatQrMod.so,应该就是用于二维码的了。用atom打开,居然发现了这个:

微信的1D/2D barcode解码居然用的是开源的ZXing!腾讯应该做了一些修改。

通过jadx反编译dex文件,可以看到有一个叫QbarNative的类:

package com.tencent.qbar;
import android.graphics.Bitmap;
import android.graphics.Point;
import com.tencent.mm.compatible.util.j;
import java.io.UnsupportedEncodingException;
public class QbarNative {
    public static byte[] data;
    public static byte[] jZG;
    public static byte[] jZH;
    public static int[] jZI;
    private static class a {
    }
    public static native int Encode(byte[] bArr, int[] iArr, String str, int i, int i2, String str2, int i3);
    private static native int EncodeBitmap(String str, Bitmap bitmap, int i, int i2, int i3, int i4, String str2, int i5);
    public static native int FocusInit(inti, int i2, boolean z, int i3, int i4);
    public static native boolean FocusPro(byte[] bArr, boolean z, boolean[] zArr);
    public static native int FocusRelease();
    private static native int GetOneResult(byte[] bArr, byte[] bArr2, byte[] bArr3, int[] iArr);
    private static native int GetResults(byte[] bArr, byte[] bArr2, byte[] bArr3, Point[] pointArr, int[] iArr, a aVar);
    public static native String GetVersion();
    public static native int Init(int i, int i2, int i3, String str, String str2);
    public static native int QIPUtilYUVCrop(byte[] bArr, byte[] bArr2, int i, int i2, int i3, int i4, int i5, int i6);
    public static native int Release();
    public static native int ScanImage(byte[] bArr, int i, int i2, int i3);
    public static native int SetReaders(int[] iArr, int i);
    public static native int focusedEngineForBankcardInit(int i, int i2, int i3, boolean z);
    public static native int focusedEngineGetVersion();
    public static native int focusedEngineProcess(byte[] bArr);
    public static native int focusedEngineRelease();
    private static native int nativeArrayConvert(int i, int i2, byte[] bArr, int[] iArr);
    private static native int nativeCropGray2(byte[] bArr, byte[] bArr2, int i, int i2, int i3);
    private static native int nativeGrayRotateCropSub(byte[] bArr, int i, int i2, int i3, int i4, int i5, int i6, byte[] bArr2, int[] iArr, int i7, int i8);
    public static native int nativeRelease();
    private static native int nativeTransBytes(int[] iArr, byte[] bArr, int i, int i2);
    private static native int nativeTransPixels(int[] iArr, byte[] bArr, int i, int i2);
    private static native int nativeYUVrotate(byte[] bArr, byte[] bArr2, int i, int i2);
    private static native int nativeYUVrotateLess(byte[] bArr, int i, int i2);
    private static native int nativeYuvToCropIntArray(byte[] bArr, int[] iArr, int i, int i2, int i3, int i4, int i5, int i6);
    static {
        jZG = new byte[100];
        data = new byte[3000];
        jZH = new byte[100];
        jZI = new int[4];
        j.a("wechatQrMod", QbarNative.class.getClassLoader());
    }
    public static int a(StringBuilder stringBuilder, StringBuilder stringBuilder2) {
        int GetOneResult = GetOneResult(jZG, data, jZH, jZI);
        try {
            String str = new String(jZH, 0, jZI[2], "UTF-8");
            if (str.equals("ANY")) {
                stringBuilder.append(new String(jZG, 0, jZI[0], "UTF-8"));
                stringBuilder2.append(new String(data, 0, jZI[1], "UTF-8"));
                if (stringBuilder2.length() == 0) {
                    stringBuilder.append(new String(jZG, 0, jZI[0], "ASCII"));
                    stringBuilder2.append(new String(data, 0, jZI[1], "ASCII"));
                }
            } else {
                stringBuilder.append(new String(jZG, 0, jZI[0], str));
                stringBuilder2.append(new String(data, 0, jZI[1], str));
            }
        } catch (UnsupportedEncodingException e) {
        }
        return GetOneResult;
    }
    public static int a(byte[] bArr, int[] iArr, byte[] bArr2, int i, int i2, int i3, int i4, int i5, int i6, int i7) {
        if (bArr == null || bArr2 == null) {
            return -1;
        }
        return nativeGrayRotateCropSub(bArr2, i, i2, i3, i4, i5, i6, bArr, iArr, i7, 0);
    }
    public static int a(byte[] bArr, byte[] bArr2, int i, int i2) {
        if (bArr2 == null) {
            return -1;
        }
        return nativeYUVrotate(bArr, bArr2, i, i2);
    }
    public static int a(byte[] bArr, byte[] bArr2, int i, int i2, int i3) {
        if (bArr == null || bArr2 == null) {
            return -1;
        }
        return nativeCropGray2(bArr, bArr2, i, i2, i3);
    }
    public static int a(byte[] bArr, int[] iArr, int i, int i2, int i3, int i4, int i5, int i6) {
        if (bArr == null) {
            return -1;
        }
        return nativeYuvToCropIntArray(bArr, iArr, i, i2, i3, i4, i5, i6);
    }
}

这下可以完全确认微信的扫码是在手机上完成的。

时间: 2024-10-07 05:55:34

微信扫一扫的扫码功能是本地实现还是联网实现的?的相关文章

微信支付教程系列之扫码支付

微信支付教程系列之扫码支付 http://www.cnblogs.com/nangong/p/9fa625bfb92a986125f0ba72704c46ec.html 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候,可以通过输入对方的微信号,也可以扫一扫对方的二维码.扫码支付,作为,微信支付里面,不可或缺的一个功能,对商品的支付提供了极为方便的体验,用途也非常的多.例如我们在地铁.公交站常见

【原创分享·微信支付】 C# 微信支付教程系列之扫码支付

微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候,可以通过输入对方的微信号,也可以扫一扫对方的二维码.扫码支付,作为,微信支付里面,不可或缺的一个功能,对商品的支付提供了极为方便的体验,用途也非常的多.例如我们在地铁.公交站常见的那些自动售货机(不错,就是那种投硬币,就可以自动出货的那种机器)中都用到.以前,那种机器,只能通过投硬币或者纸币,但是,这里面也有一定的风险

如何实现扫码功能?

之前讲过前端生成二维码,那H5 APP如何实现扫码功能; 扫码功能的实现 (一).使用H5 API barcode实现扫码功能 # 模板 <template> <div> <div class="scan"> <div id="bcid"></div> <footer> <button v-if="Start" @click="startRecognize&q

Android二维码功能实现,在程序内嵌入ZXing项目

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9526247 最近二维码真是越来越火了,随便电视上.网络上.商场里,到处都是二维码.而内嵌二维码扫描功能的软件也越来越多,QQ.微信.UC浏览器等等应用都可以对着二维码扫一扫,感觉我们自己的应用里不加上二维码扫描功能,都跟不上时代潮流了.所以今天我就将带着大家一起,在我们自己的程序里加入二维码扫描的功能. 不过,二维码功能如果真要做起来还是非常复杂的,从零开始实现不太现实,比较好的

微信开发——带参数二维码的使用

---恢复内容开始--- 最近做微信PC端网页微信相关功能的开发,从一个新手的角度来说,微信公众号的文档还是不好理解的,网上找的帖子大都也都基本上是复制微信公众平台上给的文档,开发微信带参数二维码过程中还是遇到不少坑的,在此把我的开发过程比较详细的记录下,希望对大家有所帮助. 我本次开发使用的是认证服务号. 1 接入 首先进入微信公众号 -> 基本配置 下面是基本配置的页面,在URL中填写服务器地址,这个地址就是接受微信推送事件的一个接口,我是使用thinkPHP框架开发的程序,在其中一个Mod

Android二维码功能实现,在程序内嵌入ZXing项目(转)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9526247 最近二维码真是越来越火了,随便电视上.网络上.商场里,到处都是二维码.而内嵌二维码扫描功能的软件也越来越多,QQ.微信.UC浏览器等等应用都可以对着二维码扫一扫,感觉我们自己的应用里不加上二维码扫描功能,都跟不上时代潮流了.所以今天我就将带着大家一起,在我们自己的程序里加入二维码扫描的功能. 不过,二维码功能如果真要做起来还是非常复杂的,从零开始实现不太现实,比较好的

微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能

微信小程序在12月21日发布了新版本的开发工具,并在官网公布新增分享.模板消息.客服消息.扫一扫.带参数二维码功能. 有了分享功能,相信会给很多创业者带来了无限的可能性! 下面就来看看这些新功能到底怎么用吧! 1.分享 可以分享小程序的任何一个页面给好友或群聊.注意是分享给好友或群聊,并没有分享到朋友圈.一方面微信在尝试流量分发方式,但同时又不愿意开放最大的流量入口. 开发文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/share.html?t=

用工具实现在微信里面生成带二维码的海报?

公众号粉丝裂变.快速增粉,利用微信第三方平台,自动生成海报二维码,实现统计粉丝来源查询统计系统,将营销活动设计成一张精美的海报背景图,粉丝就可以在公众号里生成一个带自己微信头像.昵称及带统计的专属二维码活动海报,通过活动激励方式让粉丝分享到朋友圈,一而二,二而三--源源不断分裂形成风暴增长! 1.在高级功能中选择->生成二维码海报注意:海报二维码功能状态 开启/关闭 ⑴数据统计报表,查看每天粉丝数量情况汇总 ⑵生成海报设置生成海报触发关键词 ⑶消息提醒设置(扫二维码后推送信息/设置扫二维码数量限

用NiceTool工具解决微信内链接或二维码可直接用外部浏览器打开

很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接,其实这并不难,只要我们实现微信跳转功能即可. 下面给大家推荐NiceTool工具(http://www.nicejump.cn/) 使用步骤 1. 用浏览器打开我们的工具地址 2. 将你的推广链接输入工具框,点击生成 3. 复制新生成的跳转链接和二维码 4. 微信内打开跳转链接或扫码识别二维码 功能效果功能实现后, 苹果用户即可在微信内直接下载app也可以跳转浏览器下载,安卓用户则自动打开手机浏览器下载app