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之第七天
Oct 09 PHP
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
PHP递归算法的详细示例分析
Feb 19 PHP
php取整函数ceil,floo,round的用法及介绍
Aug 31 PHP
分享下PHP register_globals 值为on与off的理解
Sep 26 PHP
php根据操作系统转换文件名大小写的方法
Feb 24 PHP
学习php设计模式 php实现访问者模式(Visitor)
Dec 07 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
Oct 08 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
Oct 14 PHP
PHP使用Http Post请求发送Json对象数据代码解析
Jul 16 PHP
PHP7 整型处理机制修改
Mar 09 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
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
set_include_path在win和linux下的区别
2008/01/10 PHP
php数组函数序列之array_search()- 按元素值返回键名
2011/11/04 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
php+ajax实现的点击浏览量加1
2015/04/16 PHP
CodeIgniter连贯操作的底层原理分析
2016/05/17 PHP
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
2009/07/19 Javascript
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
Vue3.x源码调试的实现方法
2019/10/13 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
2020/02/10 Javascript
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
Python API自动化框架总结
2019/11/12 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
Linux的文件类型
2016/07/05 面试题
高中军训感想800字
2014/02/23 职场文书
货车司机岗位职责
2014/03/18 职场文书
球队口号
2014/06/18 职场文书
亮剑观后感300字
2015/06/05 职场文书
六一儿童节致辞
2015/07/31 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫