php、java、android、ios通用的3des方法(推荐)


Posted in PHP onSeptember 09, 2016

php服务器,java服务器,android,ios开发兼容的3des加密解密,

php

<?php
class DES3 {
	var $key = "my.oschina.net/penngo?#@";
	var $iv = "01234567";

	function encrypt($input){
		$size = mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC);
		$input = $this->pkcs5_pad($input, $size);
		$key = str_pad($this->key,24,'0');
		$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
		if( $this->iv == '' )
		{
			$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
		}
		else
		{
			$iv = $this->iv;
		}
		@mcrypt_generic_init($td, $key, $iv);
		$data = mcrypt_generic($td, $input);
		mcrypt_generic_deinit($td);
		mcrypt_module_close($td);
		$data = base64_encode($data);
		return $data;
	}
	function decrypt($encrypted){
		$encrypted = base64_decode($encrypted);
		$key = str_pad($this->key,24,'0');
		$td = mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_CBC,'');
		if( $this->iv == '' )
		{
			$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
		}
		else
		{
			$iv = $this->iv;
		}
		$ks = mcrypt_enc_get_key_size($td);
		@mcrypt_generic_init($td, $key, $iv);
		$decrypted = mdecrypt_generic($td, $encrypted);
		mcrypt_generic_deinit($td);
		mcrypt_module_close($td);
		$y=$this->pkcs5_unpad($decrypted);
		return $y;
	}
	function pkcs5_pad ($text, $blocksize) {
		$pad = $blocksize - (strlen($text) % $blocksize);
		return $text . str_repeat(chr($pad), $pad);
	}
	function pkcs5_unpad($text){
		$pad = ord($text{strlen($text)-1});
		if ($pad > strlen($text)) {
			return false;
		}
		if (strspn($text, chr($pad), strlen($text) - $pad) != $pad){
			return false;
		}
		return substr($text, 0, -1 * $pad);
	}
	function PaddingPKCS7($data) {
		$block_size = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
		$padding_char = $block_size - (strlen($data) % $block_size);
		$data .= str_repeat(chr($padding_char),$padding_char);
		return $data;
	}
}

$des = new DES3();
echo $ret = $des->encrypt("来自http://3water.com的博客") . "\n";
echo $des->decrypt($ret) . "\n";

 java(android)

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.security.Key; 

import javax.crypto.Cipher; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESedeKeySpec; 
import javax.crypto.spec.IvParameterSpec; 
    
/** 
 * 3DES加密工具类 
 */ 
public class DES3 { 
   // 密钥 
   private final static String secretKey = "my.oschina.net/penngo?#@" ;  
   // 向量 
   private final static String iv = "01234567" ; 
   // 加解密统一使用的编码方式 
   private final static String encoding = "utf-8" ; 
    
   /** 
   * 3DES加密 
   * 
   * @param plainText 普通文本 
   * @return 
   * @throws Exception 
   */ 
   public static String encode(String plainText) throws Exception { 
     Key deskey = null ; 
     DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes()); 
     SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" ); 
     deskey = keyfactory.generateSecret(spec); 
    
     Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding" ); 
     IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); 
     cipher.init(Cipher.ENCRYPT_MODE, deskey, ips); 
     byte [] encryptData = cipher.doFinal(plainText.getBytes(encoding)); 
     return Base64.encode(encryptData); 
   } 
    
   /** 
   * 3DES解密 
   * 
   * @param encryptText 加密文本 
   * @return 
   * @throws Exception 
   */ 
   public static String decode(String encryptText) throws Exception { 
     Key deskey = null ; 
     DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());  
     SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" ); 
     deskey = keyfactory.generateSecret(spec); 
     Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding" ); 
     IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); 
     cipher.init(Cipher.DECRYPT_MODE, deskey, ips); 
    
     byte [] decryptData = cipher.doFinal(Base64.decode(encryptText)); 
    
     return new String(decryptData, encoding); 
   } 
   
 	public static String padding(String str) {
		byte[] oldByteArray;
		try {
			oldByteArray = str.getBytes("UTF8");
			int numberToPad = 8 - oldByteArray.length % 8;
			byte[] newByteArray = new byte[oldByteArray.length + numberToPad];
			System.arraycopy(oldByteArray, 0, newByteArray, 0,
					oldByteArray.length);
			for (int i = oldByteArray.length; i < newByteArray.length; ++i) {
				newByteArray[i] = 0;
			}
			return new String(newByteArray, "UTF8");
		} catch (UnsupportedEncodingException e) {
			System.out.println("Crypter.padding UnsupportedEncodingException");
		}
		return null;
	}
	
	/** 
	 * Base64编码工具类 
	 * 
	 */ 
	public static class Base64 { 
	   private static final char [] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" .toCharArray(); 
	    
	   public static String encode( byte [] data) { 
	     int start = 0 ; 
	     int len = data.length; 
	     StringBuffer buf = new StringBuffer(data.length * 3 / 2 ); 
	    
	     int end = len - 3 ; 
	     int i = start; 
	     int n = 0 ; 
	    
	     while (i <= end) { 
	       int d = (((( int ) data[i]) & 0x0ff ) << 16 ) | (((( int ) data[i + 1 ]) & 0x0ff ) << 8 ) | ((( int ) data[i + 2 ]) & 0x0ff ); 
	    
	       buf.append(legalChars[(d >> 18 ) & 63 ]); 
	       buf.append(legalChars[(d >> 12 ) & 63 ]); 
	       buf.append(legalChars[(d >> 6 ) & 63 ]); 
	       buf.append(legalChars[d & 63 ]); 
	    
	       i += 3 ; 
	    
	       if (n++ >= 14 ) { 
	         n = 0 ; 
	         buf.append( " " ); 
	       } 
	     } 
	    
	     if (i == start + len - 2 ) { 
	       int d = (((( int ) data[i]) & 0x0ff ) << 16 ) | (((( int ) data[i + 1 ]) & 255 ) << 8 ); 
	    
	       buf.append(legalChars[(d >> 18 ) & 63 ]); 
	       buf.append(legalChars[(d >> 12 ) & 63 ]); 
	       buf.append(legalChars[(d >> 6 ) & 63 ]); 
	       buf.append( "=" ); 
	     } else if (i == start + len - 1 ) { 
	       int d = ((( int ) data[i]) & 0x0ff ) << 16 ; 
	    
	       buf.append(legalChars[(d >> 18 ) & 63 ]); 
	       buf.append(legalChars[(d >> 12 ) & 63 ]); 
	       buf.append( "==" ); 
	     } 
	    
	     return buf.toString(); 
	   } 
	    
	   private static int decode( char c) { 
	     if (c >= 'A' && c <= 'Z' ) 
	       return (( int ) c) - 65 ; 
	     else if (c >= 'a' && c <= 'z' ) 
	       return (( int ) c) - 97 + 26 ; 
	     else if (c >= '0' && c <= '9' ) 
	       return (( int ) c) - 48 + 26 + 26 ; 
	     else 
	       switch (c) { 
	       case '+' : 
	         return 62 ; 
	       case '/' : 
	         return 63 ; 
	       case '=' : 
	         return 0 ; 
	       default : 
	         throw new RuntimeException( "unexpected code: " + c); 
	       } 
	   } 
	    
	   /** 
	   * Decodes the given Base64 encoded String to a new byte array. The byte array holding the decoded data is returned. 
	   */ 
	    
	   public static byte [] decode(String s) { 
	    
	     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
	     try { 
	       decode(s, bos); 
	     } catch (IOException e) { 
	       throw new RuntimeException(); 
	     } 
	     byte [] decodedBytes = bos.toByteArray(); 
	     try { 
	       bos.close(); 
	       bos = null ; 
	     } catch (IOException ex) { 
	       System.err.println( "Error while decoding BASE64: " + ex.toString()); 
	     } 
	     return decodedBytes; 
	   } 
	    
	   private static void decode(String s, OutputStream os) throws IOException { 
	     int i = 0 ; 
	    
	     int len = s.length(); 
	    
	     while ( true ) { 
	       while (i < len && s.charAt(i) <= ' ' ) 
	         i++; 
	    
	       if (i == len) 
	         break ; 
	    
	       int tri = (decode(s.charAt(i)) << 18 ) + (decode(s.charAt(i + 1 )) << 12 ) + (decode(s.charAt(i + 2 )) << 6 ) + (decode(s.charAt(i + 3 ))); 
	    
	       os.write((tri >> 16 ) & 255 ); 
	       if (s.charAt(i + 2 ) == '=' ) 
	         break ; 
	       os.write((tri >> 8 ) & 255 ); 
	       if (s.charAt(i + 3 ) == '=' ) 
	         break ; 
	       os.write(tri & 255 ); 
	    
	       i += 4 ; 
	     } 
	   } 
	} 
   
   public static void main(String[] args) throws Exception{
  	 String plainText = "来自http://3water.com的博客";
  	 String encryptText = DES3.encode(plainText);
  	 System.out.println(encryptText);
  	 System.out.println(DES3.decode(encryptText));

  	 
   }
}

 Ojbective-C(ios)

// 
// DES3Util.h 
// 
#import <Foundation/Foundation.h> 
@interface DES3Util : NSObject { 
} 
// 加密方法 
+ (NSString*)encrypt:(NSString*)plainText; 
// 解密方法 
+ (NSString*)decrypt:(NSString*)encryptText; 
@end 


// 
// DES3Util.m 
// 
    
#import "DES3Util.h" 
#import <CommonCrypto/CommonCryptor.h> 
#import "GTMBase64.h" 
#define gkey      @"my.oschina.net/penngo?#@" 
#define gIv       @"01234567" 
    
@implementation DES3Util 
// 加密方法 
+ (NSString*)encrypt:(NSString*)plainText { 
   NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding]; 
   size_t plainTextBufferSize = [data length]; 
   const void *vplainText = (const void *)[data bytes]; 
      
   CCCryptorStatus ccStatus; 
   uint8_t *bufferPtr = NULL; 
   size_t bufferPtrSize = 0; 
   size_t movedBytes = 0; 
      
   bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 
   bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t)); 
   memset((void *)bufferPtr, 0x0, bufferPtrSize); 
      
   const void *vkey = (const void *) [gkey UTF8String]; 
   const void *vinitVec = (const void *) [gIv UTF8String]; 
      
   ccStatus = CCCrypt(kCCEncrypt, 
            kCCAlgorithm3DES, 
            kCCOptionPKCS7Padding, 
            vkey, 
            kCCKeySize3DES, 
            vinitVec, 
            vplainText, 
            plainTextBufferSize, 
            (void *)bufferPtr, 
            bufferPtrSize, 
            &movedBytes); 
      
   NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; 
   NSString *result = [GTMBase64 stringByEncodingData:myData]; 
   return result; 
} 
    
// 解密方法 
+ (NSString*)decrypt:(NSString*)encryptText { 
   NSData *encryptData = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]]; 
   size_t plainTextBufferSize = [encryptData length]; 
   const void *vplainText = [encryptData bytes]; 
      
   CCCryptorStatus ccStatus; 
   uint8_t *bufferPtr = NULL; 
   size_t bufferPtrSize = 0; 
   size_t movedBytes = 0; 
   bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 
   bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t)); 
   memset((void *)bufferPtr, 0x0, bufferPtrSize);   
   const void *vkey = (const void *) [gkey UTF8String]; 
   const void *vinitVec = (const void *) [gIv UTF8String]; 
      
   ccStatus = CCCrypt(kCCDecrypt, 
            kCCAlgorithm3DES, 
            kCCOptionPKCS7Padding, 
            vkey, 
            kCCKeySize3DES, 
            vinitVec, 
            vplainText, 
            plainTextBufferSize, 
            (void *)bufferPtr, 
            bufferPtrSize, 
            &movedBytes); 
      
   NSString *result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr  
                 length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding] autorelease]; 
   return result; 
} 
    
@end






//
// GTMBase64.h
//
// Copyright 2006-2008 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

// David Lee make changes:
// Remove dependency on GTMDefines.h
// add some string to string function

#import <Foundation/Foundation.h>

// GTMBase64
//
/// Helper for handling Base64 and WebSafeBase64 encodings
//
/// The webSafe methods use different character set and also the results aren't
/// always padded to a multiple of 4 characters. This is done so the resulting
/// data can be used in urls and url query arguments without needing any
/// encoding. You must use the webSafe* methods together, the data does not
/// interop with the RFC methods.
//
@interface GTMBase64 : NSObject

//
// Standard Base64 (RFC) handling
//

// encodeData:
//
/// Base64 encodes contents of the NSData object.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)encodeData:(NSData *)data;

// decodeData:
//
/// Base64 decodes contents of the NSData object.
//
/// Returns:
///  A new autoreleased NSData with the decoded payload. nil for any error.
//
+(NSData *)decodeData:(NSData *)data;

// encodeBytes:length:
//
/// Base64 encodes the data pointed at by |bytes|.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)encodeBytes:(const void *)bytes length:(NSUInteger)length;

// decodeBytes:length:
//
/// Base64 decodes the data pointed at by |bytes|.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)decodeBytes:(const void *)bytes length:(NSUInteger)length;

// stringByEncodingData:
//
/// Base64 encodes contents of the NSData object.
//
/// Returns:
///  A new autoreleased NSString with the encoded payload. nil for any error.
//
+(NSString *)stringByEncodingData:(NSData *)data;

// stringByEncodingBytes:length:
//
/// Base64 encodes the data pointed at by |bytes|.
//
/// Returns:
///  A new autoreleased NSString with the encoded payload. nil for any error.
//
+(NSString *)stringByEncodingBytes:(const void *)bytes length:(NSUInteger)length;

// decodeString:
//
/// Base64 decodes contents of the NSString.
//
/// Returns:
///  A new autoreleased NSData with the decoded payload. nil for any error.
//
+(NSData *)decodeString:(NSString *)string;

//
// Modified Base64 encoding so the results can go onto urls.
//
// The changes are in the characters generated and also allows the result to
// not be padded to a multiple of 4.
// Must use the matching call to encode/decode, won't interop with the
// RFC versions.
//

// webSafeEncodeData:padded:
//
/// WebSafe Base64 encodes contents of the NSData object. If |padded| is YES
/// then padding characters are added so the result length is a multiple of 4.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)webSafeEncodeData:(NSData *)data
           padded:(BOOL)padded;

// webSafeDecodeData:
//
/// WebSafe Base64 decodes contents of the NSData object.
//
/// Returns:
///  A new autoreleased NSData with the decoded payload. nil for any error.
//
+(NSData *)webSafeDecodeData:(NSData *)data;

// webSafeEncodeBytes:length:padded:
//
/// WebSafe Base64 encodes the data pointed at by |bytes|. If |padded| is YES
/// then padding characters are added so the result length is a multiple of 4.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)webSafeEncodeBytes:(const void *)bytes
            length:(NSUInteger)length
            padded:(BOOL)padded;

// webSafeDecodeBytes:length:
//
/// WebSafe Base64 decodes the data pointed at by |bytes|.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)webSafeDecodeBytes:(const void *)bytes length:(NSUInteger)length;

// stringByWebSafeEncodingData:padded:
//
/// WebSafe Base64 encodes contents of the NSData object. If |padded| is YES
/// then padding characters are added so the result length is a multiple of 4.
//
/// Returns:
///  A new autoreleased NSString with the encoded payload. nil for any error.
//
+(NSString *)stringByWebSafeEncodingData:(NSData *)data
                 padded:(BOOL)padded;

// stringByWebSafeEncodingBytes:length:padded:
//
/// WebSafe Base64 encodes the data pointed at by |bytes|. If |padded| is YES
/// then padding characters are added so the result length is a multiple of 4.
//
/// Returns:
///  A new autoreleased NSString with the encoded payload. nil for any error.
//
+(NSString *)stringByWebSafeEncodingBytes:(const void *)bytes
                  length:(NSUInteger)length
                  padded:(BOOL)padded;

// webSafeDecodeString:
//
/// WebSafe Base64 decodes contents of the NSString.
//
/// Returns:
///  A new autoreleased NSData with the decoded payload. nil for any error.
//
+(NSData *)webSafeDecodeString:(NSString *)string;

// David Lee new added function
/// Returns:
// A new autoreleased NSString with Base64 encoded NSString
+(NSString *)stringByBase64String:(NSString *)base64String;

// David Lee new added function
/// Returns:
// A new autoreleased Base64 encoded NSString with NSString
+(NSString *)base64StringBystring:(NSString *)string;
@end


//
// GTMBase64.m
//
// Copyright 2006-2008 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
// David Lee make changes:
// Remove dependency on GTMDefines.h
// add some string to string function

#import "GTMBase64.h"

static const char *kBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const char *kWebSafeBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
static const char kBase64PaddingChar = '=';
static const char kBase64InvalidChar = 99;

static const char kBase64DecodeChars[] = {
  // This array was generated by the following code:
  // #include <sys/time.h>
  // #include <stdlib.h>
  // #include <string.h>
  // main()
  // {
  //  static const char Base64[] =
  //   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  //  char *pos;
  //  int idx, i, j;
  //  printf("  ");
  //  for (i = 0; i < 255; i += 8) {
  //   for (j = i; j < i + 8; j++) {
  //    pos = strchr(Base64, j);
  //    if ((pos == NULL) || (j == 0))
  //     idx = 99;
  //    else
  //     idx = pos - Base64;
  //    if (idx == 99)
  //     printf(" %2d,   ", idx);
  //    else
  //     printf(" %2d/*%c*/,", idx, j);
  //   }
  //   printf("\n  ");
  //  }
  // }
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   62/*+*/, 99,   99,   99,   63/*/ */,
  52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/,
  60/*8*/, 61/*9*/, 99,   99,   99,   99,   99,   99,
  99,    0/*A*/, 1/*B*/, 2/*C*/, 3/*D*/, 4/*E*/, 5/*F*/, 6/*G*/,
  7/*H*/, 8/*I*/, 9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/,
  15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/,
  23/*X*/, 24/*Y*/, 25/*Z*/, 99,   99,   99,   99,   99,
  99,   26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/,
  33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/,
  41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/,
  49/*x*/, 50/*y*/, 51/*z*/, 99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99
};

static const char kWebSafeBase64DecodeChars[] = {
  // This array was generated by the following code:
  // #include <sys/time.h>
  // #include <stdlib.h>
  // #include <string.h>
  // main()
  // {
  //  static const char Base64[] =
  //   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
  //  char *pos;
  //  int idx, i, j;
  //  printf("  ");
  //  for (i = 0; i < 255; i += 8) {
  //   for (j = i; j < i + 8; j++) {
  //    pos = strchr(Base64, j);
  //    if ((pos == NULL) || (j == 0))
  //     idx = 99;
  //    else
  //     idx = pos - Base64;
  //    if (idx == 99)
  //     printf(" %2d,   ", idx);
  //    else
  //     printf(" %2d/*%c*/,", idx, j);
  //   }
  //   printf("\n  ");
  //  }
  // }
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   62/*-*/, 99,   99,
  52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/,
  60/*8*/, 61/*9*/, 99,   99,   99,   99,   99,   99,
  99,    0/*A*/, 1/*B*/, 2/*C*/, 3/*D*/, 4/*E*/, 5/*F*/, 6/*G*/,
  7/*H*/, 8/*I*/, 9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/,
  15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/,
  23/*X*/, 24/*Y*/, 25/*Z*/, 99,   99,   99,   99,   63/*_*/,
  99,   26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/,
  33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/,
  41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/,
  49/*x*/, 50/*y*/, 51/*z*/, 99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99,
  99,   99,   99,   99,   99,   99,   99,   99
};


// Tests a character to see if it's a whitespace character.
//
// Returns:
//  YES if the character is a whitespace character.
//  NO if the character is not a whitespace character.
//
BOOL IsSpace(unsigned char c) {
  // we use our own mapping here because we don't want anything w/ locale
  // support.
  static BOOL kSpaces[256] = {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // 0-9
    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 10-19
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20-29
    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 30-39
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40-49
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 50-59
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60-69
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 70-79
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80-89
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 90-99
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 100-109
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 110-119
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 120-129
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 130-139
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 140-149
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 150-159
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160-169
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 170-179
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 180-189
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 190-199
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 200-209
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 210-219
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 220-229
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 230-239
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 240-249
    0, 0, 0, 0, 0, 1,       // 250-255
  };
  return kSpaces[c];
}

// Calculate how long the data will be once it's base64 encoded.
//
// Returns:
//  The guessed encoded length for a source length
//
NSUInteger CalcEncodedLength(NSUInteger srcLen, BOOL padded) {
  NSUInteger intermediate_result = 8 * srcLen + 5;
  NSUInteger len = intermediate_result / 6;
  if (padded) {
    len = ((len + 3) / 4) * 4;
  }
  return len;
}

// Tries to calculate how long the data will be once it's base64 decoded.
// Unlike the above, this is always an upperbound, since the source data
// could have spaces and might end with the padding characters on them.
//
// Returns:
//  The guessed decoded length for a source length
//
NSUInteger GuessDecodedLength(NSUInteger srcLen) {
  return (srcLen + 3) / 4 * 3;
}


@interface GTMBase64 (PrivateMethods)

+(NSData *)baseEncode:(const void *)bytes
        length:(NSUInteger)length
       charset:(const char *)charset
        padded:(BOOL)padded;

+(NSData *)baseDecode:(const void *)bytes
        length:(NSUInteger)length
       charset:(const char*)charset
    requirePadding:(BOOL)requirePadding;

+(NSUInteger)baseEncode:(const char *)srcBytes
         srcLen:(NSUInteger)srcLen
       destBytes:(char *)destBytes
        destLen:(NSUInteger)destLen
        charset:(const char *)charset
         padded:(BOOL)padded;

+(NSUInteger)baseDecode:(const char *)srcBytes
         srcLen:(NSUInteger)srcLen
       destBytes:(char *)destBytes
        destLen:(NSUInteger)destLen
        charset:(const char *)charset
     requirePadding:(BOOL)requirePadding;

@end


@implementation GTMBase64

//
// Standard Base64 (RFC) handling
//

+(NSData *)encodeData:(NSData *)data {
  return [self baseEncode:[data bytes]
           length:[data length]
          charset:kBase64EncodeChars
           padded:YES];
}

+(NSData *)decodeData:(NSData *)data {
  return [self baseDecode:[data bytes]
           length:[data length]
          charset:kBase64DecodeChars
       requirePadding:YES];
}

+(NSData *)encodeBytes:(const void *)bytes length:(NSUInteger)length {
  return [self baseEncode:bytes
           length:length
          charset:kBase64EncodeChars
           padded:YES];
}

+(NSData *)decodeBytes:(const void *)bytes length:(NSUInteger)length {
  return [self baseDecode:bytes
           length:length
          charset:kBase64DecodeChars
       requirePadding:YES];
}

+(NSString *)stringByEncodingData:(NSData *)data {
  NSString *result = nil;
  NSData *converted = [self baseEncode:[data bytes]
                 length:[data length]
                 charset:kBase64EncodeChars
                 padded:YES];
  if (converted) {
    result = [[[NSString alloc] initWithData:converted
                    encoding:NSASCIIStringEncoding] autorelease];
  }
  return result;
}

+(NSString *)stringByEncodingBytes:(const void *)bytes length:(NSUInteger)length {
  NSString *result = nil;
  NSData *converted = [self baseEncode:bytes
                 length:length
                 charset:kBase64EncodeChars
                 padded:YES];
  if (converted) {
    result = [[[NSString alloc] initWithData:converted
                    encoding:NSASCIIStringEncoding] autorelease];
  }
  return result;
}

+(NSData *)decodeString:(NSString *)string {
  NSData *result = nil;
  NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding];
  if (data) {
    result = [self baseDecode:[data bytes]
              length:[data length]
             charset:kBase64DecodeChars
          requirePadding:YES];
  }
  return result;
}

//
// Modified Base64 encoding so the results can go onto urls.
//
// The changes are in the characters generated and also the result isn't
// padded to a multiple of 4.
// Must use the matching call to encode/decode, won't interop with the
// RFC versions.
//

+(NSData *)webSafeEncodeData:(NSData *)data
           padded:(BOOL)padded {
  return [self baseEncode:[data bytes]
           length:[data length]
          charset:kWebSafeBase64EncodeChars
           padded:padded];
}

+(NSData *)webSafeDecodeData:(NSData *)data {
  return [self baseDecode:[data bytes]
           length:[data length]
          charset:kWebSafeBase64DecodeChars
       requirePadding:NO];
}

+(NSData *)webSafeEncodeBytes:(const void *)bytes
            length:(NSUInteger)length
            padded:(BOOL)padded {
  return [self baseEncode:bytes
           length:length
          charset:kWebSafeBase64EncodeChars
           padded:padded];
}

+(NSData *)webSafeDecodeBytes:(const void *)bytes length:(NSUInteger)length {
  return [self baseDecode:bytes
           length:length
          charset:kWebSafeBase64DecodeChars
       requirePadding:NO];
}

+(NSString *)stringByWebSafeEncodingData:(NSData *)data
                 padded:(BOOL)padded {
  NSString *result = nil;
  NSData *converted = [self baseEncode:[data bytes]
                 length:[data length]
                 charset:kWebSafeBase64EncodeChars
                 padded:padded];
  if (converted) {
    result = [[[NSString alloc] initWithData:converted
                    encoding:NSASCIIStringEncoding] autorelease];
  }
  return result;
}

+(NSString *)stringByWebSafeEncodingBytes:(const void *)bytes
                  length:(NSUInteger)length
                  padded:(BOOL)padded {
  NSString *result = nil;
  NSData *converted = [self baseEncode:bytes
                 length:length
                 charset:kWebSafeBase64EncodeChars
                 padded:padded];
  if (converted) {
    result = [[[NSString alloc] initWithData:converted
                    encoding:NSASCIIStringEncoding] autorelease];
  }
  return result;
}

+(NSData *)webSafeDecodeString:(NSString *)string {
  NSData *result = nil;
  NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding];
  if (data) {
    result = [self baseDecode:[data bytes]
              length:[data length]
             charset:kWebSafeBase64DecodeChars
          requirePadding:NO];
  }
  return result;
}

// David Lee new added function
/// Returns:
// A new autoreleased NSString with Base64 encoded NSString
+(NSString *)stringByBase64String:(NSString *)base64String
{
  NSString *sourceString = [[[NSString alloc] initWithData:[GTMBase64 decodeData:[base64String dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO]] encoding:NSUTF8StringEncoding] autorelease];
  return sourceString;
}

// David Lee new added function
/// Returns:
// A new autoreleased Base64 encoded NSString with NSString
+(NSString *)base64StringBystring:(NSString *)string
{
  NSString *base64String = [[[NSString alloc] initWithData:[GTMBase64 encodeData:[string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO]] encoding:NSUTF8StringEncoding] autorelease];
  return base64String;
}

@end

@implementation GTMBase64 (PrivateMethods)

//
// baseEncode:length:charset:padded:
//
// Does the common lifting of creating the dest NSData. it creates & sizes the
// data for the results. |charset| is the characters to use for the encoding
// of the data. |padding| controls if the encoded data should be padded to a
// multiple of 4.
//
// Returns:
//  an autorelease NSData with the encoded data, nil if any error.
//
+(NSData *)baseEncode:(const void *)bytes
        length:(NSUInteger)length
       charset:(const char *)charset
        padded:(BOOL)padded {
  // how big could it be?
  NSUInteger maxLength = CalcEncodedLength(length, padded);
  // make space
  NSMutableData *result = [NSMutableData data];
  [result setLength:maxLength];
  // do it
  NSUInteger finalLength = [self baseEncode:bytes
                    srcLen:length
                  destBytes:[result mutableBytes]
                   destLen:[result length]
                   charset:charset
                    padded:padded];
  if (finalLength) {
    NSAssert(finalLength == maxLength, @"how did we calc the length wrong?");
  } else {
    // shouldn't happen, this means we ran out of space
    result = nil;
  }
  return result;
}

//
// baseDecode:length:charset:requirePadding:
//
// Does the common lifting of creating the dest NSData. it creates & sizes the
// data for the results. |charset| is the characters to use for the decoding
// of the data.
//
// Returns:
//  an autorelease NSData with the decoded data, nil if any error.
//
//
+(NSData *)baseDecode:(const void *)bytes
        length:(NSUInteger)length
       charset:(const char *)charset
    requirePadding:(BOOL)requirePadding {
  // could try to calculate what it will end up as
  NSUInteger maxLength = GuessDecodedLength(length);
  // make space
  NSMutableData *result = [NSMutableData data];
  [result setLength:maxLength];
  // do it
  NSUInteger finalLength = [self baseDecode:bytes
                    srcLen:length
                  destBytes:[result mutableBytes]
                   destLen:[result length]
                   charset:charset
                requirePadding:requirePadding];
  if (finalLength) {
    if (finalLength != maxLength) {
      // resize down to how big it was
      [result setLength:finalLength];
    }
  } else {
    // either an error in the args, or we ran out of space
    result = nil;
  }
  return result;
}

//
// baseEncode:srcLen:destBytes:destLen:charset:padded:
//
// Encodes the buffer into the larger. returns the length of the encoded
// data, or zero for an error.
// |charset| is the characters to use for the encoding
// |padded| tells if the result should be padded to a multiple of 4.
//
// Returns:
//  the length of the encoded data. zero if any error.
//
+(NSUInteger)baseEncode:(const char *)srcBytes
         srcLen:(NSUInteger)srcLen
       destBytes:(char *)destBytes
        destLen:(NSUInteger)destLen
        charset:(const char *)charset
         padded:(BOOL)padded {
  if (!srcLen || !destLen || !srcBytes || !destBytes) {
    return 0;
  }
  
  char *curDest = destBytes;
  const unsigned char *curSrc = (const unsigned char *)(srcBytes);
  
  // Three bytes of data encodes to four characters of cyphertext.
  // So we can pump through three-byte chunks atomically.
  while (srcLen > 2) {
    // space?
    NSAssert(destLen >= 4, @"our calc for encoded length was wrong");
    curDest[0] = charset[curSrc[0] >> 2];
    curDest[1] = charset[((curSrc[0] & 0x03) << 4) + (curSrc[1] >> 4)];
    curDest[2] = charset[((curSrc[1] & 0x0f) << 2) + (curSrc[2] >> 6)];
    curDest[3] = charset[curSrc[2] & 0x3f];
    
    curDest += 4;
    curSrc += 3;
    srcLen -= 3;
    destLen -= 4;
  }
  
  // now deal with the tail (<=2 bytes)
  switch (srcLen) {
    case 0:
      // Nothing left; nothing more to do.
      break;
    case 1:
      // One byte left: this encodes to two characters, and (optionally)
      // two pad characters to round out the four-character cypherblock.
      NSAssert(destLen >= 2, @"our calc for encoded length was wrong");
      curDest[0] = charset[curSrc[0] >> 2];
      curDest[1] = charset[(curSrc[0] & 0x03) << 4];
      curDest += 2;
      destLen -= 2;
      if (padded) {
        NSAssert(destLen >= 2, @"our calc for encoded length was wrong");
        curDest[0] = kBase64PaddingChar;
        curDest[1] = kBase64PaddingChar;
        curDest += 2;
      }
      break;
    case 2:
      // Two bytes left: this encodes to three characters, and (optionally)
      // one pad character to round out the four-character cypherblock.
      NSAssert(destLen >= 3, @"our calc for encoded length was wrong");
      curDest[0] = charset[curSrc[0] >> 2];
      curDest[1] = charset[((curSrc[0] & 0x03) << 4) + (curSrc[1] >> 4)];
      curDest[2] = charset[(curSrc[1] & 0x0f) << 2];
      curDest += 3;
      destLen -= 3;
      if (padded) {
        NSAssert(destLen >= 1, @"our calc for encoded length was wrong");
        curDest[0] = kBase64PaddingChar;
        curDest += 1;
      }
      break;
  }
  // return the length
  return (curDest - destBytes);
}

//
// baseDecode:srcLen:destBytes:destLen:charset:requirePadding:
//
// Decodes the buffer into the larger. returns the length of the decoded
// data, or zero for an error.
// |charset| is the character decoding buffer to use
//
// Returns:
//  the length of the encoded data. zero if any error.
//
+(NSUInteger)baseDecode:(const char *)srcBytes
         srcLen:(NSUInteger)srcLen
       destBytes:(char *)destBytes
        destLen:(NSUInteger)destLen
        charset:(const char *)charset
     requirePadding:(BOOL)requirePadding {
  if (!srcLen || !destLen || !srcBytes || !destBytes) {
    return 0;
  }
  
  int decode;
  NSUInteger destIndex = 0;
  int state = 0;
  char ch = 0;
  while (srcLen-- && (ch = *srcBytes++) != 0) {
    if (IsSpace(ch)) // Skip whitespace
      continue;
    
    if (ch == kBase64PaddingChar)
      break;
    
    decode = charset[(unsigned int)ch];
    if (decode == kBase64InvalidChar)
      return 0;
    
    // Four cyphertext characters decode to three bytes.
    // Therefore we can be in one of four states.
    switch (state) {
      case 0:
        // We're at the beginning of a four-character cyphertext block.
        // This sets the high six bits of the first byte of the
        // plaintext block.
        NSAssert(destIndex < destLen, @"our calc for decoded length was wrong");
        destBytes[destIndex] = decode << 2;
        state = 1;
        break;
      case 1:
        // We're one character into a four-character cyphertext block.
        // This sets the low two bits of the first plaintext byte,
        // and the high four bits of the second plaintext byte.
        NSAssert((destIndex+1) < destLen, @"our calc for decoded length was wrong");
        destBytes[destIndex] |= decode >> 4;
        destBytes[destIndex+1] = (decode & 0x0f) << 4;
        destIndex++;
        state = 2;
        break;
      case 2:
        // We're two characters into a four-character cyphertext block.
        // This sets the low four bits of the second plaintext
        // byte, and the high two bits of the third plaintext byte.
        // However, if this is the end of data, and those two
        // bits are zero, it could be that those two bits are
        // leftovers from the encoding of data that had a length
        // of two mod three.
        NSAssert((destIndex+1) < destLen, @"our calc for decoded length was wrong");
        destBytes[destIndex] |= decode >> 2;
        destBytes[destIndex+1] = (decode & 0x03) << 6;
        destIndex++;
        state = 3;
        break;
      case 3:
        // We're at the last character of a four-character cyphertext block.
        // This sets the low six bits of the third plaintext byte.
        NSAssert(destIndex < destLen, @"our calc for decoded length was wrong");
        destBytes[destIndex] |= decode;
        destIndex++;
        state = 0;
        break;
    }
  }
  
  // We are done decoding Base-64 chars. Let's see if we ended
  //   on a byte boundary, and/or with erroneous trailing characters.
  if (ch == kBase64PaddingChar) {        // We got a pad char
    if ((state == 0) || (state == 1)) {
      return 0; // Invalid '=' in first or second position
    }
    if (srcLen == 0) {
      if (state == 2) { // We run out of input but we still need another '='
        return 0;
      }
      // Otherwise, we are in state 3 and only need this '='
    } else {
      if (state == 2) { // need another '='
        while ((ch = *srcBytes++) && (srcLen-- > 0)) {
          if (!IsSpace(ch))
            break;
        }
        if (ch != kBase64PaddingChar) {
          return 0;
        }
      }
      // state = 1 or 2, check if all remain padding is space
      while ((ch = *srcBytes++) && (srcLen-- > 0)) {
        if (!IsSpace(ch)) {
          return 0;
        }
      }
    }
  } else {
    // We ended by seeing the end of the string.
    
    if (requirePadding) {
      // If we require padding, then anything but state 0 is an error.
      if (state != 0) {
        return 0;
      }
    } else {
      // Make sure we have no partial bytes lying around. Note that we do not
      // require trailing '=', so states 2 and 3 are okay too.
      if (state == 1) {
        return 0;
      }
    }
  }
  
  // If then next piece of output was valid and got written to it means we got a
  // very carefully crafted input that appeared valid but contains some trailing
  // bits past the real length, so just toss the thing.
  if ((destIndex < destLen) &&
    (destBytes[destIndex] != 0)) {
    return 0;
  }
  
  return destIndex;
}

以上这篇php、java、android、ios通用的3des方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
Jan 16 PHP
PHP操作Memcache实例介绍
Jun 14 PHP
php function用法如何递归及return和echo区别
Mar 07 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
Aug 20 PHP
Web程序工作原理详解
Dec 25 PHP
php使用wordwrap格式化文本段落的方法
Mar 17 PHP
php中PDO方式实现数据库的增删改查
May 17 PHP
php判断表是否存在的方法
Jun 18 PHP
php中的登陆login实例代码
Jun 20 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
Sep 09 #PHP
PHP实现的网站目录扫描索引工具
Sep 08 #PHP
php操作xml并将其插入数据库的实现方法
Sep 08 #PHP
php添加数据到xml文件的简单例子
Sep 08 #PHP
Yii2中事务的使用实例代码详解
Sep 07 #PHP
PHP模糊查询的实现方法(推荐)
Sep 06 #PHP
浅谈PHP中的数据传输CURL
Sep 06 #PHP
You might like
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
PHP 和 MySQL 基础教程(二)
2006/10/09 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
浅析vue数据绑定
2017/01/17 Javascript
微信小程序 两种为对象属性赋值的方式详解
2017/02/23 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
python函数定义和调用过程详解
2020/02/09 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
商场主管竞聘书
2014/03/31 职场文书
法制宣传月活动方案
2014/05/11 职场文书
保护环境倡议书100字
2014/05/19 职场文书
四查四看整改措施
2014/09/19 职场文书
英文导游词
2015/02/13 职场文书
社区敬老月活动总结
2015/05/07 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书