微信扫一扫的扫码功能是本地实现的还是网络化的?
最编程
2024-04-29 08:39:15
...
【直播预告】大模型会取代程序员吗?”
微信扫一扫的扫码功能很弱,速度慢,经常有二维码识别不了。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);
}
}
这下可以完全确认微信的扫码是在手机上完成的。
推荐阅读
-
微信 "扫一扫 "物联网,全面揭秘 "扫一扫 "背后的扫盲技术!-1.1 扫一扫感知物体是做什么的? 1.1 微信扫一扫是做什么的? 扫一扫识物是指以图片或视频(商品图片:鞋/包/美妆/服饰/家电/玩具/图书/食品/珠宝/家具/其他商品)为输入媒介,挖掘微信内容生态中的有价值信息(电商+百科+资讯,如图1所示),并展示给用户。这里的电商基本涵盖了微信小程序覆盖上亿SKU的全量优质电商,可以支持用户货比N家并直接下单购买,百科和资讯则聚合了微信内的头部自媒体如搜狗、搜搜、百度等,向用户展示和分享拍摄商品相关的内容资讯。 图 1 扫一扫识别功能示意图 欢迎大家更新iOS新版微信→扫一扫→识货,亲自体验,也欢迎大家通过识货界面的反馈按钮向我们提交反馈意见。 扫一扫识物实景图展示 1.2 扫一扫识物有哪些使用场景? 扫一扫识物的目的是为用户访问微信内部生态内容开辟一个新窗口,以用户扫图片为输入形式,为用户提供微信生态内容中的百科、资讯、电商等作为展示页面。除了用户熟悉的扫一扫操作外,我们还将进一步拓展长按操作,让用户更方便地进行扫一扫操作。"扫一扫知事 "的落地场景主要涵盖三大部分: a. 科普知识: a.科普知识。用户通过扫一扫,可以在微信生态圈中获取该对象的百科、资讯等常识或趣闻,帮助用户更好地了解该对象; b.购物场景。同样的搜索功能支持用户看到喜欢的商品立即检索到微信小程序电商中的同款商品,支持用户即扫即购; c.广告场景。扫一扫识别物体可以辅助公众号文章、视频更好地理解其中蕴含的图片信息,从而更好地投放匹配广告,提高点击率。 1.3 Sweep Sense 为 Sweep 家族带来了哪些新技术? 对于扫一扫来说,大家耳熟能详的应该就是扫一扫二维码、扫一扫小程序码、扫一扫条形码、扫一扫翻译了。无论是各种形式的编码还是文字字符,都可以看作是图片的一种特定编码形式,而物的识别则是对自然场景图片的识别,这对于扫一扫家族来说是一个质的飞跃,我们希望从物的识别入手,进一步拓展扫一扫对自然场景图片的理解能力,比如扫酒、扫车、扫植物、扫人脸等服务,如下图3所示。 图 3 Sweep 家族
-
微信扫一扫的扫码功能是本地实现的还是网络化的?
-
微信扫一扫隐藏了三个强大实用的功能,它们是什么?
-
用最简单的 js 调用 VUE 中的微信扫一扫功能
-
aps是什么意思_不同的富士APS-C画幅微单区别在哪里,档次是怎么划分的?-X-A系列原本指的是富士的入门级微单,最大的特点是没有使用富士X-Trans™CMOS 传感器,目前在售的有两款,分别是XA5和XA7。 富士(FUJIFILM)X-A5/XA5 15-45套机 富士(FUJIFILM)X-A7/XA7 15-45套机 目前这两款相机都处于历史最低价附近,XA5套机2699元,XA7套机3999元。XA5就是一个标准的入门级相机,定位就是时尚小巧自拍,在2699这个价位不要对它的性能有太多的奢求。 XA7价格来到了3999元,这就很有意思了,富士把入门型的相机价格推到了4000元,并且提供了自拍翻转屏和4K30P视频录制,这样一款相机就很有性价比了。 XE3是老款的中端相机,价格和入门级的XA7是一样的,都是3999元,这两款相机如何做选择呢?XE3有着更多的按键意味着更好的操控,但屏幕不是自拍翻转屏所以这点不如XA7好用。 要注意的是XE3用的是富士独有的X-Trans™CMOS III传感器,XA7是普通的2400万像素传感器,你可以理解为X-Trans才是富士的精髓。 富士(FUJIFILM)X-E3 15-45套机 当然,买新不买旧,XA7的新功能和自拍翻转屏可能会更适合你。 XT200是富士专门针对vlog市场推出的相机,其实之前的XA7也可以拍摄vlog,但XT200是富士官方宣传中的第一款vlog相机。数码防抖+3.5mm 麦克风口+自拍翻转屏+无裁切4K30P,这些都是XT200的优势,但这款相机也是普通的2400万像素传感器,没有用富士独有的X-Trans,可能是从价格角度考虑做了阉割吧。 富士(FUJIFILM)X-T200/XT200 微单相机 Vlog相机 富士XT30是我认为富士性价比最高的微单照相机,注意我说的是照相机。理由很简单,因为从拍照角度来看XT30和XTXT3几乎没有明显差距,主要是操控差了一些、视频性能大幅削弱,但好歹也是个有着双波轮+曝光补偿波轮+快门速度波轮的相机,操控方面不会太差的。视频方面也有着超采4K 30P的规格,支持F-log输出。 可以这么说,如果你只拍照,那么XT30是富士微单中性价比最高的,视频方面XT30也不差,只不过没有专业的10bit和4K60P而已。 富士(FUJIFILM)X-T30/XT30 15-45套机 XT3和XT4得放在一起说,这两款相机其实都挺好,420 10bit 4K60P的专业视频模式基本代表了APS-C画幅的上限水平。XT4还提升了电池续航增加了五轴防抖,配上富士独特的胶片滤镜,不管是拍照还是拍视频都非常优秀。 不要觉得这两款相机贵,同价位里能做到4K60P的微单也就是M43画幅的GGHGH5S,最便宜的G9机身也要7000多,这APS-C画幅的XT3机身接近8000也算合理价格范围内。除此之外的4K60P机身只有13998的松下S5和15999的佳能R6了。 富士(FUJIFILM)X-T3/XT3 1855套机 富士(FUJIFILM)X-T4/XT4 微单相机 套机(18-55mm) B站更新4K视频投稿后有很多人想拍摄4K升格,在很长一段时间里富士XT3和XT4是最优选,毕竟兼顾视频和拍照,对焦也还算能用。 X-Pro3和X-Pro2这两款微单可以算是旁轴相机,是富士官方意义上的旗舰级相机。从用料做工操控按键角度来说的确是旗舰级别,但视频性能方面只有4K30P,价格却比XT3还贵,可能这就是旁轴情怀带来的溢价吧。 富士(FUJIFILM)X-Pro3 微单相机 机身 黑色 我在之前的文章里提过很多次,有一些相机属于如果你想买你压根不会看测评,如果你犹豫那么这款相机不适合你,为什么这么说,因为有一些比较小众的相机可能在性能上并不好,但独特的外形、操控、体积、传承赋予了它独特的定位。譬如富士X-Pro系列微单就是旁轴的电子化,理光GR传承大师的扫街理念,尼康DF的外形源自胶片时代的相机,这些相机就不是针对大多数消费者的,定位就是小众。所以我说喜欢就买,不要考虑什么性能规格。 X100系列相机是一款不可换镜头的等效35mm旁轴数码相机,从外形看就是经典的复古造型。这两款相机和X-Pro3一样,如果你喜欢那就买,别犹豫, 你在市场上找不到同类型的其他数码相机,徕卡Q是28mm,索尼RX1R系列是35mm但外形不够复古,X100系列就是独特的你没有其他选择。 那么X100F和X100V该如何选择呢?X100F的镜头很一般甚至算不上好,如果我没记错的话和初代的X100是同款镜头,X100V的镜头是全新制作的很棒,X100V的机身性能也和XTX-Pro3差不多。 富士(FUJIFILM)X100F 数码相机 旁轴 2430万像素 富士(FUJIFILM)X100V 数码相机 旁轴 2610万像素 还是那句话,这两款相机也是那种如果你喜欢那就毫不犹豫下单的类型,而且这两款相机也没有竞品。 以前不推荐富士的原因是原厂镜头太贵,现在唯卓仕给富士出了四款可以自动对焦的大光圈镜头,覆盖35到130mm的焦段,可以基本满足人像摄影爱好者的需求。拍风景的话国产很多镜头厂商都有富士卡口的手动镜头可以选择,从这个角度来说富士微单就非常值得入手了。 和友商竞品相比:
-
在同一台电脑或手机的不同浏览器上使用微信扫码实现无间断登录的方法
-
如何轻松快速实现微信小程序的扫码功能
-
在微信公众号内的H5页面实现扫码功能的调用
-
在Vue中实现对企业微信自建应用的授权方式:静默授权、手动授权与扫码授权
-
用 Vue 实现企业微信的扫一扫登录功能