关于OPENSSL的使用

#import <Foundation/Foundation.h>

 

@interface RSAEncryptor : NSObject

/**

 *  加密方法

 *

 *  @param str   需要加密的字符串

 *  @param path  '.der'格式的公钥文件路径

 */

+ (NSString *)encryptString:(NSString *)str publicKeyWithContentsOfFile:(NSString *)path;

 

/**

 *  解密方法

 *

 *  @param str       需要解密的字符串

 *  @param path      '.p12'格式的私钥文件路径

 *  @param password  私钥文件密码

 */

+ (NSString *)decryptString:(NSString *)str privateKeyWithContentsOfFile:(NSString *)path password:(NSString *)password;

 

/**

 *  加密方法

 *

 *  @param str    需要加密的字符串

 *  @param pubKey 公钥字符串

 */

+ (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey;

 

/**

 *  解密方法

 *

 *  @param str     需要解密的字符串

 *  @param privKey 私钥字符串

 */

+ (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey;

 

@end

 

 

 

 

 

 

 

 

//

//  RSAEncryptor.m

//  RepairCenter

//

//  Created by 王效金 on 16/7/18.

//  Copyright © 2016年 Neil. All rights reserved.

//

 

#import "RSAEncryptor.h"

#import <Security/Security.h>

 

@implementation RSAEncryptor

 

static NSString *base64_encode_data(NSData *data){

    data = [data base64EncodedDataWithOptions:0];

    NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    return ret;

}

 

static NSData *base64_decode(NSString *str){

    NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];

    return data;

}

 

#pragma mark - 使用'.der'公钥文件加密

 

//加密

+ (NSString *)encryptString:(NSString *)str publicKeyWithContentsOfFile:(NSString *)path{

    if (!str || !path)  return nil;

    return [self encryptString:str publicKeyRef:[self getPublicKeyRefWithContentsOfFile:path]];

}

 

//获取公钥

+ (SecKeyRef)getPublicKeyRefWithContentsOfFile:(NSString *)filePath{

    NSData *certData = [NSData dataWithContentsOfFile:filePath];

    if (!certData) {

        return nil;

    }

    SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)certData);

    SecKeyRef key = NULL;

    SecTrustRef trust = NULL;

    SecPolicyRef policy = NULL;

if (cert != NULL) {

        policy = SecPolicyCreateBasicX509();

        if (policy) {

            if (SecTrustCreateWithCertificates((CFTypeRef)cert, policy, &trust) == noErr) {

                SecTrustResultType result;

                if (SecTrustEvaluate(trust, &result) == noErr) {

                    key = SecTrustCopyPublicKey(trust);

                }

            }

        }

    }

    if (policy) CFRelease(policy);

    if (trust) CFRelease(trust);

    if (cert) CFRelease(cert);

    return key;

}

 

+ (NSString *)encryptString:(NSString *)str publicKeyRef:(SecKeyRef)publicKeyRef{

    if(![str dataUsingEncoding:NSUTF8StringEncoding]){

        return nil;

    }

    if(!publicKeyRef){

        return nil;

    }

    NSData *data = [self encryptData:[str dataUsingEncoding:NSUTF8StringEncoding] withKeyRef:publicKeyRef];

    NSString *ret = base64_encode_data(data);

    return ret;

}

 

#pragma mark - 使用'.12'私钥文件解密

 

//解密

+ (NSString *)decryptString:(NSString *)str privateKeyWithContentsOfFile:(NSString *)path password:(NSString *)password{

    if (!str || !path) return nil;

    if (!password) password = @"";

    return [self decryptString:str privateKeyRef:[self getPrivateKeyRefWithContentsOfFile:path password:password]];

}

 

//获取私钥

+ (SecKeyRef)getPrivateKeyRefWithContentsOfFile:(NSString *)filePath password:(NSString*)password{

   

    NSData *p12Data = [NSData dataWithContentsOfFile:filePath];

    if (!p12Data) {

        return nil;

    }

    SecKeyRef privateKeyRef = NULL;

    NSMutableDictionary * options = [[NSMutableDictionary alloc] init];

    [options setObject: password forKey:(__bridge id)kSecImportExportPassphrase];

    CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

    OSStatus securityError = SecPKCS12Import((__bridge CFDataRef) p12Data, (__bridge CFDictionaryRef)options, &items);

    if (securityError == noErr && CFArrayGetCount(items) > 0) {

        CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);

        SecIdentityRef identityApp = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity);

        securityError = SecIdentityCopyPrivateKey(identityApp, &privateKeyRef);

        if (securityError != noErr) {

            privateKeyRef = NULL;

        }

    }

    CFRelease(items);

   

    return privateKeyRef;

}

 

+ (NSString *)decryptString:(NSString *)str privateKeyRef:(SecKeyRef)privKeyRef{

    NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];

    if (!privKeyRef) {

        return nil;

    }

    data = [self decryptData:data withKeyRef:privKeyRef];

    NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    return ret;

}

 

#pragma mark - 使用公钥字符串加密

 

/* START: Encryption with RSA public key */

 

//使用公钥字符串加密

+ (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey{

    NSData *data = [self encryptData:[str dataUsingEncoding:NSUTF8StringEncoding] publicKey:pubKey];

    NSString *ret = base64_encode_data(data);

    return ret;

}

 

+ (NSData *)encryptData:(NSData *)data publicKey:(NSString *)pubKey{

    if(!data || !pubKey){

        return nil;

    }

    SecKeyRef keyRef = [self addPublicKey:pubKey];

    if(!keyRef){

        return nil;

    }

    return [self encryptData:data withKeyRef:keyRef];

}

 

+ (SecKeyRef)addPublicKey:(NSString *)key{

    NSRange spos = [key rangeOfString:@"-----BEGIN PUBLIC KEY-----"];

    NSRange epos = [key rangeOfString:@"-----END PUBLIC KEY-----"];

    if(spos.location != NSNotFound && epos.location != NSNotFound){

        NSUInteger s = spos.location + spos.length;

        NSUInteger e = epos.location;

        NSRange range = NSMakeRange(s, e-s);

        key = [key substringWithRange:range];

    }

    key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""];

    key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""];

    key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""];

    key = [key stringByReplacingOccurrencesOfString:@" "  withString:@""];

   

    // This will be base64 encoded, decode it.

    NSData *data = base64_decode(key);

    data = [self stripPublicKeyHeader:data];

    if(!data){

        return nil;

    }

   

    //a tag to read/write keychain storage

    NSString *tag = @"RSAUtil_PubKey";

    NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];

   

    // Delete any old lingering key with the same tag

    NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];

    [publicKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];

    [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];

    [publicKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag];

    SecItemDelete((__bridge CFDictionaryRef)publicKey);

   

    // Add persistent version of the key to system keychain

    [publicKey setObject:data forKey:(__bridge id)kSecValueData];

    [publicKey setObject:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)

     kSecAttrKeyClass];

    [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)

     kSecReturnPersistentRef];

   

    CFTypeRef persistKey = nil;

    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)publicKey, &persistKey);

    if (persistKey != nil){

        CFRelease(persistKey);

    }

    if ((status != noErr) && (status != errSecDuplicateItem)) {

        return nil;

    }

   

    [publicKey removeObjectForKey:(__bridge id)kSecValueData];

    [publicKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef];

    [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];

    [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];

   

    // Now fetch the SecKeyRef version of the key

    SecKeyRef keyRef = nil;

    status = SecItemCopyMatching((__bridge CFDictionaryRef)publicKey, (CFTypeRef *)&keyRef);

    if(status != noErr){

        return nil;

    }

    return keyRef;

}

 

+ (NSData *)stripPublicKeyHeader:(NSData *)d_key{

    // Skip ASN.1 public key header

    if (d_key == nil) return(nil);

   

    unsigned long len = [d_key length];

    if (!len) return(nil);

   

    unsigned char *c_key = (unsigned char *)[d_key bytes];

    unsigned int  idx     = 0;

   

    if (c_key[idx++] != 0x30) return(nil);

   

    if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1;

    else idx++;

   

    // PKCS #1 rsaEncryption szOID_RSA_RSA

    static unsigned char seqiod[] =

    { 0x30,   0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,

        0x01, 0x05, 0x00 };

    if (memcmp(&c_key[idx], seqiod, 15)) return(nil);

   

    idx += 15;

   

    if (c_key[idx++] != 0x03) return(nil);

   

    if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1;

    else idx++;

   

    if (c_key[idx++] != '\0') return(nil);

   

    // Now make a new NSData from this buffer

    return ([NSData dataWithBytes:&c_key[idx] length:len - idx]);

}

 

+ (NSData *)encryptData:(NSData *)data withKeyRef:(SecKeyRef) keyRef{

    const uint8_t *srcbuf = (const uint8_t *)[data bytes];

    size_t srclen = (size_t)data.length;

   

    size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t);

    void *outbuf = malloc(block_size);

    size_t src_block_size = block_size - 11;

   

    NSMutableData *ret = [[NSMutableData alloc] init];

    for(int idx=0; idx<srclen; idx+=src_block_size){

        //NSLog(@"%d/%d block_size: %d", idx, (int)srclen, (int)block_size);

        size_t data_len = srclen - idx;

        if(data_len > src_block_size){

            data_len = src_block_size;

        }

       

        size_t outlen = block_size;

        OSStatus status = noErr;

        status = SecKeyEncrypt(keyRef,

                               kSecPaddingPKCS1,

                               srcbuf + idx,

                               data_len,

                               outbuf,

                               &outlen

                               );

        if (status != 0) {

            NSLog(@"SecKeyEncrypt fail. Error Code: %d", (int)status);

            ret = nil;

            break;

        }else{

            [ret appendBytes:outbuf length:outlen];

        }

    }

   

    free(outbuf);

    CFRelease(keyRef);

    return ret;

}

 

/* END: Encryption with RSA public key */

 

#pragma mark - 使用私钥字符串解密

 

/* START: Decryption with RSA private key */

 

//使用私钥字符串解密

+ (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey{

    if (!str) return nil;

    NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];

    data = [self decryptData:data privateKey:privKey];

    NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    return ret;

}

 

+ (NSData *)decryptData:(NSData *)data privateKey:(NSString *)privKey{

    if(!data || !privKey){

        return nil;

    }

    SecKeyRef keyRef = [self addPrivateKey:privKey];

    if(!keyRef){

        return nil;

    }

    return [self decryptData:data withKeyRef:keyRef];

}

 

+ (SecKeyRef)addPrivateKey:(NSString *)key{

    NSRange spos = [key rangeOfString:@"-----BEGIN RSA PRIVATE KEY-----"];

    NSRange epos = [key rangeOfString:@"-----END RSA PRIVATE KEY-----"];

    if(spos.location != NSNotFound && epos.location != NSNotFound){

        NSUInteger s = spos.location + spos.length;

        NSUInteger e = epos.location;

        NSRange range = NSMakeRange(s, e-s);

        key = [key substringWithRange:range];

    }

    key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""];

    key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""];

    key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""];

    key = [key stringByReplacingOccurrencesOfString:@" "  withString:@""];

   

    // This will be base64 encoded, decode it.

    NSData *data = base64_decode(key);

    data = [self stripPrivateKeyHeader:data];

    if(!data){

        return nil;

    }

   

    //a tag to read/write keychain storage

    NSString *tag = @"RSAUtil_PrivKey";

    NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];

   

    // Delete any old lingering key with the same tag

    NSMutableDictionary *privateKey = [[NSMutableDictionary alloc] init];

    [privateKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];

    [privateKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];

    [privateKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag];

    SecItemDelete((__bridge CFDictionaryRef)privateKey);

   

    // Add persistent version of the key to system keychain

    [privateKey setObject:data forKey:(__bridge id)kSecValueData];

    [privateKey setObject:(__bridge id) kSecAttrKeyClassPrivate forKey:(__bridge id)

     kSecAttrKeyClass];

    [privateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)

     kSecReturnPersistentRef];

   

    CFTypeRef persistKey = nil;

    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)privateKey, &persistKey);

    if (persistKey != nil){

        CFRelease(persistKey);

    }

    if ((status != noErr) && (status != errSecDuplicateItem)) {

        return nil;

    }

   

    [privateKey removeObjectForKey:(__bridge id)kSecValueData];

    [privateKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef];

    [privateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];

    [privateKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];

   

    // Now fetch the SecKeyRef version of the key

    SecKeyRef keyRef = nil;

    status = SecItemCopyMatching((__bridge CFDictionaryRef)privateKey, (CFTypeRef *)&keyRef);

    if(status != noErr){

        return nil;

    }

    return keyRef;

}

 

+ (NSData *)stripPrivateKeyHeader:(NSData *)d_key{

    // Skip ASN.1 private key header

    if (d_key == nil) return(nil);

   

    unsigned long len = [d_key length];

    if (!len) return(nil);

   

    unsigned char *c_key = (unsigned char *)[d_key bytes];

    unsigned int  idx     = 22; //magic byte at offset 22

   

    if (0x04 != c_key[idx++]) return nil;

   

    //calculate length of the key

    unsigned int c_len = c_key[idx++];

    int det = c_len & 0x80;

    if (!det) {

        c_len = c_len & 0x7f;

    } else {

        int byteCount = c_len & 0x7f;

        if (byteCount + idx > len) {

            //rsa length field longer than buffer

            return nil;

        }

        unsigned int accum = 0;

        unsigned char *ptr = &c_key[idx];

        idx += byteCount;

        while (byteCount) {

            accum = (accum << 8) + *ptr;

            ptr++;

            byteCount--;

        }

        c_len = accum;

    }

   

    // Now make a new NSData from this buffer

    return [d_key subdataWithRange:NSMakeRange(idx, c_len)];

}

 

+ (NSData *)decryptData:(NSData *)data withKeyRef:(SecKeyRef) keyRef{

    const uint8_t *srcbuf = (const uint8_t *)[data bytes];

    size_t srclen = (size_t)data.length;

   

    size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t);

    UInt8 *outbuf = malloc(block_size);

    size_t src_block_size = block_size;

   

    NSMutableData *ret = [[NSMutableData alloc] init];

    for(int idx=0; idx<srclen; idx+=src_block_size){

        //NSLog(@"%d/%d block_size: %d", idx, (int)srclen, (int)block_size);

        size_t data_len = srclen - idx;

        if(data_len > src_block_size){

            data_len = src_block_size;

        }

       

        size_t outlen = block_size;

        OSStatus status = noErr;

        status = SecKeyDecrypt(keyRef,

                               kSecPaddingNone,

                               srcbuf + idx,

                               data_len,

                               outbuf,

                               &outlen

                               );

        if (status != 0) {

            NSLog(@"SecKeyEncrypt fail. Error Code: %d", status);

            ret = nil;

            break;

        }else{

            //the actual decrypted data is in the middle, locate it!

            int idxFirstZero = -1;

            int idxNextZero = (int)outlen;

            for ( int i = 0; i < outlen; i++ ) {

                if ( outbuf[i] == 0 ) {

                    if ( idxFirstZero < 0 ) {

                        idxFirstZero = i;

                    } else {

                        idxNextZero = i;

                        break;

                    }

                }

            }

           

            [ret appendBytes:&outbuf[idxFirstZero+1] length:idxNextZero-idxFirstZero-1];

        }

    }

   

    free(outbuf);

    CFRelease(keyRef);

    return ret;

}

 

/* END: Decryption with RSA private key */

 

@end

 

 

使用说明:

  1. 将此.h和.m文件直接复制,并拖到工程中;
  2. 加密和解密需要对应的私钥和公钥(是.der的文件);
  3. 使用:

        NSString *public_key_path = [[NSBundle mainBundle] pathForResource:@"pub.der" ofType:nil];

        NSString *str = [NSString stringWithFormat:@"account=%@&passwd=%@",name,pwd];

        NSString *requestidEncryptStr = [RSAEncryptor encryptString:str publicKeyWithContentsOfFile:public_key_path];

        NSLog(@"加密前 %@",str);

        NSLog(@"加密后 %@",requestidEncryptStr);

        NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:requestidEncryptStr, @"input", nil];

        [self xjpostDic:dic withRequestid:requestid onSuccess:success onFailure:failure];

  4. 这个是加密过程,pub.der是加密使用的公钥。

转载于:https://www.cnblogs.com/wangxiaojingtl/p/6722950.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jelastic Java云端平台

谁在Jelastic背后&#xff1f; 那是我的第一个问题&#xff0c;因此我浏览了Jelastic网站。 回答此问题的最佳方法是查看“ Jelastic团队”部分。 创始人&#xff0c;顾问&#xff0c;特殊合作伙伴构成了一支真正的专业团队。 作为特殊的合作伙伴&#xff0c;您会发现MySQL&am…

请先设置tkk_搅拌站水泥罐仓顶除尘器设置及调整

搅拌站水泥罐仓顶除尘器采用脉冲喷吹清灰系统&#xff0c;除尘器本体结构&#xff0c;采用标准模板焊接&#xff0c;整体结构&#xff0c;强度牢靠&#xff0c;组装维修方便&#xff0c;脉冲清灰采用时序控制器MCY系列 控制阀门KEK系列&#xff0c;喷吹清灰频率及喷吹间隔可手…

Eclipse Meaven Spring SpringMVC Mybaits整合

本示例是在&#xff1a;Ubuntu15上实现的&#xff1b;Windows上安装Maven将不太相同。 Maven Install Run command sudo apt-get install maven, to install the latest Apache Maven.Run command mvn -version to verify your installation.Where is Maven installed? The co…

抽象类和抽象函数

1.抽象函数的语法特征 什么是抽象函数&#xff1f; 只有函数的定义,没有函数体的函数被称为抽象函数&#xff1b; Abstract void fun(); 如果一个类拥有一个或一个以上的抽象函数&#xff0c;那么这个类必须被定义为抽象类 2.抽象类的语法特征 使用abstract定义的类被称之…

并发–执行程序和Spring集成

基于线程池/执行器的实现 比原始线程版本更好的方法是基于线程池的线程池&#xff0c;其中基于运行任务的系统定义了适当的线程池大小– CPU数量/&#xff08;任务的1-Blocking Coefficient&#xff09;。 Venkat Subramaniams书中有更多详细信息&#xff1a; 首先&#xff0c…

后面的参数_英特尔I系列CPU大家都知道,后面的参数你有没有了解过

嗨&#xff01;大家好&#xff0c;我是伟仔&#xff0c;今天主要是和大家聊下CPU。大多数人买笔记本或台式电脑对CPU的要求就知道I5或者I7之类的。像是I7一定比I5要好&#xff0c;I3很LOU这样的&#xff0c;当然这样子的观点是不正确的&#xff0c;今天我会告诉大家&#xff0c…

設置Linux保留物理內存並使用 (1)

在Linux系統中可以通過memblock來設置系統保留物理內存&#xff0c;防止這些內存被內存管理系統分配出去。 作者&#xff1a; 彭東林 郵箱&#xff1a; pengdonglin137163.com 平臺 硬件平臺&#xff1a; TQ2440 Linux版本&#xff1a;Linux 3.14.45 說明 1. 在tq2440上&#x…

移动端

http://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html 移动端手淘使用方案 移动端px自动转换rem插件 CSSREM Flexible 转载于:https://www.cnblogs.com/yuruiweb/p/6723580.html

OutOfMemoryError:Java堆空间–分析和解决方法

java.lang.OutOfMemoryError&#xff1a;Java堆问题是在支持或开发复杂的Java EE应用程序时可能会遇到的最复杂的问题之一。 这篇简短的文章将为您提供此JVM HotSpot OutOfMemoryError错误消息的描述&#xff0c;以及在解决该问题之前应如何解决此问题。 有关如何确定要处理的O…

函数伪代码_Excel常用函数

欢迎大家在此收看任我行office教程系列&#xff0c;这一期我来为大家讲什么内容呢&#xff0c;那就是几个office的几个常用函数了&#xff0c;如果您不会这些函数和函数嵌套那么您的Excel电子表格也就别玩了哈&#xff0c;那么他们分别是什么函数呢。咱们现在隆重有请这几位函数…

阻止Ajax多次提交

1、Ajax的abort() xhr $.ajax({})if (xhr){xhr.abort(); } 2、通过在Ajax的beforeSend()方法以及complete()方法添加删除类&#xff0c;对类进行判断&#xff0c;对于两者来回切换的时候&#xff0c;对类的设置不好进行操作上的时候&#xff0c;可以通过使用一个input框&#…

POJ3675 Telescope 圆和多边形的交

POJ3675 用三角剖分可以轻松搞定&#xff0c;数据也小 随便AC。 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #include<vector> usi…

windows搭建python开发环境方法_04 Windows下搭建 Python 开发环境 - Python 入门教程

前面两个小节中我们已经学习了在 MacOS 和 Ubuntu 中安装 Python 的开发环境。当然&#xff0c;作为用户基数最多的 Windows 操作系统&#xff0c;我们当然不会忘记&#xff0c;这节课我们就来学习下如何在 Windows 下搭建 Python 的开发环境。1. 下载 Python1.1 Python 2 与 P…

消除view旋转后边缘有锯齿的情况

view的layer中有个属性叫 allowsEdgeAntialiasing&#xff1b; 在形变后有边缘有锯齿的话 可以 view.layer.allowsEdgeAntialiasing YES; 消除锯齿 如果直接在*-Info.plist配置 Renders with edge antialiasing YES 会导致UIAlertView显示有问题。转载于:https://www.cnblogs…

Google AppEngine:任务队列API

任务队列 com.google.appengine.api.taskqueue 使用任务队列&#xff0c;用户可以发起一个请求&#xff0c;以使应用程序执行此请求之外的工作。 它们是进行后台工作的强大工具。 此外&#xff0c;您可以将工作组织成小的离散单元&#xff08;任务&#xff09;。 然后&#xf…

打印5列五颗星_55组“数学顺口溜” 大九九乘法口诀表!孩子想学好数学必须背熟...

小学数学需要记住的知识点还是比较多的&#xff0c;看到这些知识点&#xff0c;很多孩子都觉得枯燥&#xff0c;不愿意用心去记。今天&#xff0c;我们给孩子们汇总了55组“数学顺口溜”和大九九乘法口诀&#xff0c;让孩子们在轻松有趣的氛围中学到知识&#xff01;55组“顺口…

C++学习48 对ASCII文件的读写操作

如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件)。程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符。 对ASCII文件的读写操作可以用以下两种方法&#xff1a;1) 用流插入运算符“<<”和流提取…

文献综述写作之“结构内容”

综述&#xff1a; 又称文献综述&#xff0c;英文名为review。它是利用已发表的文献资料为原始素材撰写的&#xff0c;通过对已发表材料的组织、综合和评价&#xff0c;以及对当前研究进展的考察来澄清问题。在某种意义上&#xff0c;综述论文具有一定的指导性&#xff0c;包括以…

NetBeans 7.2 beta:更快,更有用

NetBeans 7.2的beta版本引起了极大的兴奋。 在本文中&#xff0c;我将简要介绍一下此版本令人兴奋的原因&#xff08;包括更好的性能&#xff0c;提供更多的提示以及集成FindBugs&#xff09;。 NetBeans 7.2 beta在典型的下载捆绑软件中可用&#xff0c;从较小的Java SE&#…

地铁闸门会夹伤人吗_家长们注意啦!又有孩子被地铁闸机夹翻

原标题&#xff1a;家长们注意啦&#xff01;又有孩子被地铁闸机夹翻现代快报讯(通讯员狄公宣记者顾元森)家长带着孩子通过地铁站闸机&#xff0c;这件事情看似简单&#xff0c;却隐藏着风险。近日&#xff0c;南京地铁又发生了一起儿童被闸机夹翻的事&#xff0c;所幸孩子并无…