Python-binascii

Python-binascii

官方文档

1.binascii模块下的函数(uu编码的我就不写了)
binascii.a2b_base64(string):将base64数据块转换成二进制并以二进制数据形式返回,一次可以传递多行数据
binascii.b2a_base64(data,*,newline=True):将二进制数据转换为一行用base64编码的ASCII字符串,返回值是转换后的行数据,如果newline为true,则返回值包括换行符,该函数的输出符合:RFC:3548(一种base编码规则)
binascii.b2a_hex(data[,sep[,bytes_per_sep=1]])和binascii.hexlify(data[,sep[,bytes_per_sep=1]]):返回二进制数据data的十六进制表示形式,data的每个字节都被转换成为对应的2位十六进制表示形式,因此返回的字节对象的长度是data的两倍,如果指定了sep,它必须是单字符str或bytes对象,他被插入每个bytes_per_sep输入字节之后,分隔符位置默认从输出的有段开始计数,如果你希望从左端开始计数,要提供一个负的bytes_per_sep值
binascii.a2b_hex(hexstr)和binascii.unhexlify(hexstr):返回有十六进制字符串hexstr表示的二进制数据,此函数功能与b2a_hex相反,hexstr必须包含偶数个十六进制数字(大小写不限),否则会报错
import binascii

a = b’helloworld’
b = binascii.b2a_hex(a)
print(b)
print(binascii.a2b_hex(b))

c = binascii.hexlify(a) #该功能和b2a_hex()一样
print(c)

print(binascii.unhexlify(c)) #该功能和a2b_hex()一样
#########################运行结果############################
b’68656c6c6f776f726c64′
b’helloworld’
b’68656c6c6f776f726c64′
b’helloworld’

”’
python其他关于转换的内置函数
hex():把整形十进制数转换成十六进制数
1.23.hex():把浮点型转换成十六进制数
hex()与binascii.hexlify()函数的区别就在于hex只能接受整形不能接受字符串
int([x[,base]]):可以对x数值类型进行说明,默认十进制,*后输出十进制数
bin():把十进制整形转换成二进制字符
oct():把十进制整形转换成八进制字符
chr():把一个整型转换成ACSII表种对应的字符,注意该整型的范围在[0,255]之间
ord():把一个ASCII表中对应的字符转换成对应的整形,与chr()刚好相反
注:unichr()是chr()的unicode版本,例如返回的字符a会变为u’a’
”’

判断数是否为丑数

判断数是否为丑数
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

方法一:数学思维

class Solution:
def isUgly(self, num : int) -> bool :
if num < 1 :
return False
factors=[2,3,5]
for factor in factors:
while num % factor ==0 :
num = num / factor
return num == 1

if __name__==”__main__”:
num=int(input(“请输入一个数字:”))
sol=Solution()
print(sol.isUgly(num))

方法二:递归

class Solution:
def isUgly(self, num: int) -> bool:
for p in 2, 3, 5:
while num % p == 0 < num:
num //= p
return num == 1

if __name__==”__main__”:
num=int(input(“请输入一个数字:”))
sol=Solution()
print(sol.isUgly(num))

以上为python代码,如果使用其它语言,只要遵循其语法规则即可。

*大数

*大数

*大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个*大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

from typing import List
import functools
class Solution:
def largestNumber(self, nums: List[int]) -> str:
def compare(x, y): return int(y+x) – int(x+y)
nums = sorted(map(str, nums), key=functools.cmp_to_key(compare))
return “0” if nums[0]==”0″ else “”.join(nums)

if __name__==”__main__”:
sol=Solution()
nums=[39,50,59,12]
print(sol.largestNumber(nums))

ps:代码使用python3语言

BFS和DFS代码实现

BFS和DFS代码实现

BFS DFS实现图的遍历
以以下图数据为例:

%title插图%num

首先BFS是广度优先遍历算法,从图的某一个节点出发,然后遍历完这个节点相邻的节点。这个算法的核心就是,先把周围的找完,再去找更深的地方。通俗易懂的说法:DFS就是一条路走到底,发现没路了,返回来,走另一条路。BFS就是每条路都走一点,走一点点后就走另一条路了。
在BFS遍历的时候,需要用队列将遍历的这个节点的相邻节点添加到队列中去,然后取队首,将这个节点相邻的节点加到队列中(未在队列中的),重复上述步骤。
以上面的图为例,假定我们先将A节点加入队列中,然后A节点出队列,与A节点相邻的B、C节点依次入队列,然后B节点出队列,与B节点相邻的C、D节点依次入队列…
*终我们得到的出队列的顺序为:A B C D E F,此答案不唯一,比如在A出队列后,可以先将B加入队列,然后是C,那么结果可能是A C B D E F,注意:*对不可能是A B C E D F,因为B和E不相邻。
根据以上思路,我们用Python代码实现BFS如下:

def DFS(graph, s):
queue = []
queue.append(s) # 向list添加元素,用append()
seen = set() # 此处为set, python里set用的是hash table, 搜索时比数组要快。
seen.add(s) # 向set添加函数,用add()
while (len(queue) > 0):
vertex = queue.pop(0) # 弹出*后一个元素
nodes = graph[vertex]
for w in nodes:
if w not in seen:
queue.append(w)
seen.add(w)
print(vertex)
graph = {
“A”:[“B”,”C”],
“B”:[“A”,”C”,”D”],
“C”:[“A”,”B”,”D”,”E”],
“D”:[“B”,”C”,”E”,”F”],
“E”:[“C”,”D”],
“F”:[“D”]
}
DFS(graph, ‘A’)

C++代码如下:

#include <bits/stdc++.h>
using namespace std;
queue<char> q;
bool a[200];
void BFS(vector<char> vi[],char root)
{
q.push(root);
while(!q.empty())
{
char c = q.front();
q.pop();
cout << c << ” “;
a[(int)c] = 1;
for(int i=0; i<vi[c].size(); i++)
{
if(a[(int)vi[c][i]]==0)
{
q.push(vi[c][i]);
a[(int)vi[c][i]] = 1;
}
}
}
}
int main(void)
{
vector<char> vi[100];
vi[‘A’].push_back(‘B’);
vi[‘A’].push_back(‘C’);
vi[‘B’].push_back(‘A’);
vi[‘B’].push_back(‘C’);
vi[‘B’].push_back(‘D’);
vi[‘C’].push_back(‘A’);
vi[‘C’].push_back(‘B’);
vi[‘C’].push_back(‘D’);
vi[‘C’].push_back(‘E’);
vi[‘D’].push_back(‘B’);
vi[‘D’].push_back(‘C’);
vi[‘D’].push_back(‘E’);
vi[‘D’].push_back(‘F’);
vi[‘E’].push_back(‘C’);
vi[‘E’].push_back(‘D’);
vi[‘F’].push_back(‘D’);
BFS(vi, ‘E’);
}

DFS和BFS的唯一不同就是把队列换成栈

Python篇-简易邮箱

Python篇-简易邮箱

python编写简易邮箱
打开邮箱的IMAP/SMTP服务
1、进入qq邮箱账户设置页面

%title插图%num

2、找到服务,打开服务

%title插图%num

3、复制下授权码(编程时需要)

%title插图%num
代码实现
”’
发送邮件
”’
import tkinter
import smtplib
from email.mime.text import MIMEText

class SendMail:
# 初始化画窗口
def __init__(self):
# 创建窗口对象
windows = tkinter.Tk()
# 设置标题
windows.title(“邮件发送”)
# 设置大小
windows.geometry(“500×300″)
# 设置窗口大小不可变
windows.resizable(width=False, height=False)

# 创建文本标签
text_title = tkinter.Label(windows, text=”\n\n邮件主题”)
# 展示文本标签
text_title.pack()
self.ed_sendTitle = tkinter.Entry(windows, width=”50″)
self.ed_sendTitle.pack();

text_msg = tkinter.Label(windows, text=”邮件正文”)
text_msg.pack()
self.ed_sendMsg = tkinter.Entry(windows, width=”50″)
self.ed_sendMsg.pack();

text_sendName = tkinter.Label(windows, text=”发件人昵称”)
text_sendName.pack()
self.ed_sendName = tkinter.Entry(windows, width=”50″)
self.ed_sendName.pack();

text_toUserName = tkinter.Label(windows, text=”收件人邮箱”)
text_toUserName.pack()
self.ed_toUserName = tkinter.Entry(windows, width=”50″)
self.ed_toUserName.pack();

btn = tkinter.Button(windows, text=”发送”, command=self.sendMsg)
btn.pack()

# 显示窗口
windows.mainloop()

def sendMsg(self):
#发送邮件
#标题
title = self.ed_sendTitle.get()
# 正文
text = self.ed_sendMsg.get()
# 发件人
sendName = self.ed_sendName.get()
sendUserName = “[email protected]
sendCode = “usdtkujdfdfeehdc”
#[email protected]
# 收件人邮箱
toUserName = self.ed_toUserName.get()
”’
1、封装邮件
”’
msg = MIMEText(text)
msg[“subject”] = title
msg[“from”] = sendName
”’
2、登录邮箱
”’
email = smtplib.SMTP(“smtp.qq.com”, 25)
email.login(sendUserName, sendCode)
”’
3、发送邮件
”’
email.sendmail(sendUserName, toUserName, msg=msg.as_string())
”’
4、退出邮箱
”’
email.quit()

if __name__ == ‘__main__’:
sendMail = SendMail()

运行效果

%title插图%num

IOS 学习总结之动画

  1. UIView的,翻转、旋转,偏移,翻页,缩放,取反的动画效果
  2. 翻转的动画
  3. //开始动画
  4. [UIView beginAnimations:@”doflip” context:nil];
  5. //设置时常
  6. [UIView setAnimationDuration:1];
  7. //设置动画淡入淡出
  8. [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
  9. //设置代理
  10. [UIView setAnimationDelegate:self];
  11. //设置翻转方向
  12. [UIView setAnimationTransition:
  13. UIViewAnimationTransitionFlipFromLeft forView:manImageView cache:YES];
  14. //动画结束
  15. [UIView commitAnimations];
  16. 旋转动画
  17. 创建一个CGAffineTransform transform对象
  18. CGAffineTransform transform;
  19. //设置旋转度数
  20. transform = CGAffineTransformRotate(manImageView.transform,M_PI/6.0);
  21. //动画开始
  22. [UIView beginAnimations:@”rotate” context:nil ];
  23. //动画时常
  24. [UIView setAnimationDuration:2];
  25. //添加代理
  26. [UIView setAnimationDelegate:self];
  27. //获取transform的值
  28. [manImageView setTransform:transform];
  29. //关闭动画
  30. [UIView commitAnimations];
  31. 偏移动画
  32. [UIView beginAnimations:@”move” context:nil];
  33. [UIView setAnimationDuration:2];
  34. [UIView setAnimationDelegate:self];
  35. //改变它的frame的x,y的值
  36. manImageView.frame=CGRectMake(100,100, 120,100);
  37. [UIView commitAnimations];
  38. 翻页动画
  39. [UIView beginAnimations:@”curlUp” context:nil];
  40. [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//指定动画曲线类型,该枚举是默认的,线性的是匀速的
  41. //设置动画时常
  42. [UIView setAnimationDuration:1];
  43. [UIView setAnimationDelegate:self];
  44. //设置翻页的方向
  45. [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:manImageView cache:YES];
  46. //关闭动画
  47. [UIView commitAnimations];
  48. 缩放动画
  49. CGAffineTransform transform;
  50. transform = CGAffineTransformScale(manImageView.transform,1.2,1.2);
  51. [UIView beginAnimations:@”scale” context:nil];
  52. [UIView setAnimationDuration:2];
  53. [UIView setAnimationDelegate:self];
  54. [manImageView setTransform:transform];
  55. [UIView commitAnimations];
  56. 取反的动画效果是根据当前的动画取他的相反的动画
  57. CGAffineTransform transform;
  58. transform=CGAffineTransformInvert(manImageView.transform);
  59. [UIView beginAnimations:@”Invert” context:nil];
  60. [UIView setAnimationDuration:2];//动画时常
  61. [UIView setAnimationDelegate:self];
  62. [manImageView setTransform:transform];//获取改变后的view的transform
  63. [UIView commitAnimations];//关闭动画

zxing 二维码扫描 配置和使用

二维码扫描使用*多的主要有两个库:zbarSDK 和zxing

关于zbar的使用比较简单,在这里不多说了,对于zxing的使用就比较麻烦,虽然网上有很多关于zxing的使用方法,不过查了很多中文和英文的贴子。发现说的都不够详细,对与像我这样*次搞的新手来说差一步就错了很多!

现在根据自己项目中使用的情况,详细具体的总结一下如何将ZXing集成到已有的iOS工程中

*步:首先去Google Code或Github将ZXing的代码下载下来(ZXing(Github镜像地址)),整个工程比较大,我们只需要其中涉及iOS的部分,所以*好做一些裁剪。简单来说,我们只需要保留cpp和iphone这2个文件夹,其余的全部删掉。如下图所示:

%title插图%num

第二步:裁剪,对于cpp这个目录,只保留cpp/core/src/zxing下面的内容,其余内容也可以删掉了。同样对iphone这个目录只需要保存 iphone/ZXingWidget/下面的内容,但是整个目录结构必须保持原样。裁剪完后,整个目录结构如下所示:

%title插图%num

第三步:首先将修该后的zxing上面的开发包(即上面修改后的zxing文件夹),拷贝到你的项目根文件夹下面;

添加文件到你的工程中,选择“Add filesto…”,在弹出的框中,找到:你的项目文件夹/zxing/iphone/ZXingWidget下面的ZXingWidget.xcodeproj,选择”ZXingWidget.xcodeproj”,在添加前,请先运行该项目,进行编译,如果成功,再进行此步添加!

添加成功后项目结构如下图:

%title插图%num

第四步:选择你的项目–TARGETS–Build Phases—Target Dependencies—-然后点击”+”添加“ZXingWidget”。添加后如下图:

%title插图%num
第五步:

同样,添加frameWorks.方法:Build Phases—Target Dependencies—-”Link Binary With Libraries”—点击”+”。添加如下几项:

libZXingWidget.a

AddressBook

AddressBookUI

AudioToolbox

AVFoundation

CoreMedia

CoreVideo

libiconv.dylib

完成后如下图:

%title插图%num

第六步:后一步,在设置中增加如下2个header search path:

1. BuildSettings — 2.搜索”header search paths” — 3.双击”HeaderSearch Paths”

/zxing/iphone/ZXingWidget/Classes
./zxing/cpp/core/src
需要注意的是,*个path要设置成循环查找子目录,而第二个不循环查找,如下图所示:

%title插图%num

完成这一步,就已经完成了ZXing库的集成工作,(如果不做修改的话,zxing暂时只能识别二维码,不能识别条形码)

在这里编译工程,应该能成功,不会报错,如果有报错信息等,看看是否是少添加了库,Header Search Paths中的路径是否正确;

 

在项目中引用

首先将你使用ZXingWidgetController的文件的后缀该为.mm, 例如:我在MyZxingViewController.m改为:MyZxingViewController.mm否则在使用的时候会报:xxx filenot found的类似的问题

同时你必须将 #import<ZXingWidgetController.h>添加到你的.h文件中将

#import <QRCodeReader.h>

#import <MultiFormatOneDReader.h>添加到.mm文件中,否则也会报iostream file not found类似的问题

 

MyZxingViewController文件夹中引用

.h

#import <UIKit/UIKit.h>

#import “ZXingWidgetController.h”

//#import “QRCodeReader.h”//这个引用在.h文件中为出错:iostream file not found

@interface Contact : UIViewController <ZXingDelegate>{

UITextView *resultsView;

NSString *resultsToDisplay;

}

@property (retain, nonatomic) IBOutlet UITextView *resultsView;

@property (nonatomic, copy) NSString *resultsToDisplay;

– (IBAction)scanPressed:(id)sender;

@end

 

具体用法可以参考ZXing(Github镜像地址)中的例子

 

修改zxing 使其能扫描条形码

例子中的代码确实只能做二维码的识别, 不能做条形码的扫描。 研究了一下又在网上找了一下,  结果发现稍做修改,还是可以让ZXing支持条形码和二维码的同时识别的, 代码稍侯就贴出来。本人亲自试过,确实可行。

总结地来说, ZBar使用起来比ZXing相对方便一点, 也就是更像是 卡片机与单反相机的区别。但如果需要修改代码的话,做一些自定义什么的,建议使用ZXing, 如果只是想随便用用的话, 建议使用ZBar.

好,话不多说, 下面说说如何使ZXing改改后可以支持扫条形码。

1.在- (IBAction)scanPressed:(id)sender方法中:
ZXingWidgetController*widController = [[ZXingWidgetControlleralloc] initWithDelegate:selfshowCancel:YESOneDMode:YES];
MultiFormatOneDReader*OneReaders=[[MultiFormatOneDReader alloc]init];
QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];
NSSet*readers = [[NSSet alloc] initWithObjects:OneReaders,qrcodeReader,nil];
[qrcodeReader release];[OneReaders release];
2.在ZXingWidgetController.m的(void)captureOutput:(AVCaptureOutput *)captureOutput :方法中,注释掉以下方法
if(oneDMode) {

// let’s just give the decoder a vertical band right above the red line

cropRect.origin.x = cropRect.origin.x + (cropRect.size.width / 2) – (ONE_D_BAND_HEIGHT + 1);

cropRect.size.width = ONE_D_BAND_HEIGHT;

// do a rotate

CGImageRef croppedImg = CGImageCreateWithImageInRect(capture, cropRect);

capture = [selfCGImageRotated90:croppedImg];

capture = [selfCGImageRotated180:capture];

//              UIImageWriteToSavedPhotosAlbum([UIImage imageWithCGImage:capture], nil, nil, nil);

CGImageRelease(croppedImg);

cropRect.origin.x = 0.0;

cropRect.origin.y = 0.0;

cropRect.size.width = CGImageGetWidth(capture);

cropRect.size.height = CGImageGetHeight(capture);

}

 

3. 将上面注释掉的代码向下数大概约20行处的代码:UIImage *scrn = [[UIImage alloc] initWithCGImage:newImage]; 改为:int backCameraImageOrientation = UIImageOrientationRight; UIImage *scrn = [[UIImage alloc] initWithCGImage:newImage scale: (CGFloat)1.0 orientation:backCameraImageOrientation];

4. 在OverlayView.m注释代码以下代码:

self.oneDMode = isOneDModeEnabled;
然后运行 , 会发现可扫条形码了 ,   还可以同时扫二维码了

用Python对文件夹中的文件重新排序命名

用Python对文件夹中的文件重新排序命名

利用Python对文件重新排序命名
在小伙伴们儿开始运行某一段算法的时候,往往需要对数据进行预处理,然而其中*常见的处理方式之一就是对文件的批量重命名。逻辑很简单、思路也很清晰,可是有的时候就是想不起来该从何下手。

解放小白双手,让python带你遨游。

老规矩 直接肝代码
// rename
import os
path = “F:/data/save2”
filelist = os.listdir(path) //读取文件内容
count=1
for file in filelist: //遍历文件
print(file)
for file in filelist:
Olddir=os.path.join(path,file)
if os.path.isdir(Olddir):
continue
filename=os.path.splitext(file)[0]
filetype=os.path.splitext(file)[1]
Newdir=os.path.join(path,str(count).zfill(6)+filetype)
//zfill(6):表示命名为6位数
os.rename(Olddir,Newdir)

count+=1

打印出原始文件名

%title插图%num
重命名之后的结果

%title插图%num

Opencv二维直方图

Opencv二维直方图

文章目录
1 理论
2 二维直方图
3 绘制二维直方图
1 理论
一维直方图中,仅考虑像素的灰度强度值;二维直方图中,则需要考虑像素的色相和饱和度值。

2 二维直方图
cv.calcHist():对于颜色直方图,需要将图像从RGB转换为HSV,且参数如下:
1)channel = [0, 1]:需要同时处理H和S平面;
2)bins = [182, 256]:分别对应于H、S平面;
3)range = [0, 180, 0, 256]:分别对应于色相值、饱和度。

import cv2 as cv

img = cv.imread(“1.jpg”)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
hist = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
print(hist)

3 绘制二维直方图
1)cv.imshow():绘制一张灰度图,除非知道不同颜色的色相值。

import cv2 as cv

img = cv.imread(“1.jpg”)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
hist = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
cv.imshow(“”, hist)
cv.waitKey()

2)matplotlib.pyplot.imshow():

import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread(“miao.png”)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
hist = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
plt.imshow(hist, interpolation=”nearest”)
plt.show()

输出如下:

%title插图%num
参考文献:
【1】Opencv中文文档;

ZXing 二维码 For IOS 配置以及使用

ZXing(Github镜像地址)是一个开源的条码生成和扫描库(开源协议为Apache2.0)。它不但支持众多的条码格式,而且有各种语言的实现版本,它支持的语言包括:Java, C++, C#, Objective-C, ActionScript和Ruby。

ZBar一般都是直接使用现成的静态库就好了,除非自己要自定义一些功能。zxing也可以但是要包含好多 头文件,还是直接引用工程方便。
下面是具体步骤:
 1.在github 下载zxing开源的代码https://github.com/zxing/zxing。
2.我们保留我们需要的cpp和iphone这2个文件夹,其余的全部删掉。如下图所示
%title插图%num
%title插图%num
3.对于cpp这个目录,只保留cpp/core/src/zxing下面的内容,其余内容也可以删掉了。但是整个目录结构必须保持原样。裁剪完后,整个目录结构如下所示:
%title插图%num
%title插图%num
4.接下来,我们把裁剪后的zxing目录整个移动到你自己的项目的根目录下,并且把上图中可以看到的ZXingWidget.xcodeproj文件拖动到你的iOS工程中。

%title插图%num%title插图%num

二:

%title插图%num%title插图%num

5.我们需要设置ZXing项目和我们原本的iOS项目之间的依赖关系。在我们的iOS项目的设置中,点击build phases tab,然后增加 Target Dependencies 和 Link binary,并且增加这些framework依赖:

完成之后如下图:

%title插图%num%title插图%num

二:

%title插图%num%title插图%num

*后一步,在设置中增加如下2个header search path:

 

./zxing/iphone/ZXingWidget/Classes

./zxing/cpp/core/src

需要注意的是,*个path要设置成循环查找子目录,而第二个不循环查找,如下图所示:

%title插图%num

注意:我在使用中遇到了一些问题,主要是编译的问题。

 

1.一个是找不到 头文件。解决方法:把用到ZXing的源文件扩展名由.m改成.mm。

2.报错:Undefined symbols for architecture armv7s,解决方法:把ZXingWidget的一个build target参数:”Build Active Architecture Only” 修改成 “NO”.

%title插图%num%title插图%num

3.报错:No such file or directory,出现该错误可能是你的Header Search Path写错了,或者就是你的zxing库的目录结构不是我上面强调的,好好检查一下吧。

4.如果遇到下面问题:

std::allocator<char> const&)", referenced from:  
  
(null): "std::string::append(std::string const&)", referenced from:  
  
(null): "std::__throw_out_of_range(char const*)", referenced from:  
  
(null): "std::ios_base::Init::Init()", referenced from:  
  
(null): "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)", referenced from:  
  
(null): "std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()", referenced from:  
  
(null): "std::string::append(unsigned long, char)", referenced from:  
  
(null): "std::string::_M_leak_hard()", referenced from:  
  
(null): "std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const", referenced from:  
  
(null): "std::string::erase(unsigned long, unsigned long)", referenced from:
(null): Linker command failed with exit code 1 (use -v to see invocation)

 

就是C++编译器的设置问题

在Build Settings里我们设置一下:

%title插图%num%title插图%num

这样就ok了。

如果再提示

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_QRCodeReader", referenced from:
      objc-class-ref in ViewController.o
  "_OBJC_CLASS_$_ZXingWidgetController", referenced from:
      objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

那是zxing不支持*新的arm64架构,改两个地方

1.选armv7和armv7s

%title插图%num

2.删除arm64

%title插图%num

 

如果要加入生成二维码的功能,从下面的链接下载Zxing Demo

http://code4app.com/ios/ZXing-Demo/515561f76803fa5e77000002

 

1.首先把ThirdParty这个文件夹拖到自己的工程里面来,注意是跟main.n在同一级目录,如下图

%title插图%num

注意QRCodeEncoderObjectiveCAtGithub.xcodeproj的targets

%title插图%num

在项目的targets里面加入这两个

%title插图%num

下面这个要注意,ZXingDemo是示例工程名,这里要改成自己项目的名称。

%title插图%num

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速