中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php和go按位異結果有什么不同

發布時間:2021-09-03 19:31:46 來源:億速云 閱讀:184 作者:chen 欄目:編程語言

這篇文章主要講解了“php和go按位異結果有什么不同”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“php和go按位異結果有什么不同”吧!

  • PHP的按位異或

echo "'Y'的ASCII值是:" . ord('Y') . PHP_EOL;
echo "8的ASCII值是:" . ord(8) . PHP_EOL;
echo "'8'的ASCII值是:" . ord('8') . PHP_EOL;

echo "'Y' ^ 8 = " . ('Y' ^ 8) . PHP_EOL; // 8
echo "'Y' + 8 = " . ('Y' + 8) . PHP_EOL; // 8
echo "'Y' ^ '8' = " . ('Y' ^ '8') . PHP_EOL; // a
echo "89 ^ 8 = " . (89 ^ 8) . PHP_EOL; // 81
echo "'89' ^ 8 = " . ('89' ^ 8) . PHP_EOL; // 81
#解析
// Y ascii 89   ^  '8' ascii 56
// 89 ^ 8  = 1011001
//         ^ 0001000
//         = 1010001 = 64 + 16 + 4 + 1 = 81

// 89 ^ 56 = 1011001
//         ^ 0111000
//         = 1100001 = 64 + 32 + 1 = 97 = a
#結果
'Y'的ASCII值是:89
8的ASCII值是:56
'8'的ASCII值是:56
'Y' ^ 8 = 8
'Y' + 8 = 8
'Y' ^ '8' = a
89 ^ 8 = 81
'89' ^ 8 = 81
小結

php 非數字字符串和整型 運算 時,取值為0


  • Go的按位異或

func main() {
    fmt.Println("'Y' ^ 8 =", 'Y' ^ 8)
    fmt.Println("'Y' ^ '8' =", 'Y' ^ '8')
    fmt.Println("89 ^ 8 =", 89 ^ 8)
}
#結果
'Y' ^ 8 = 81
'Y' ^ '8' = 97
89 ^ 8 = 81
小結

go相對來說還是比較嚴謹,將rune都轉為了對應ascii碼值進行運算


擴展 網絡上常用的一種加密解密算法

PHP實現

// 加密函數
function encryptOp($string)
{
	$string = str_replace(' ', '+', $string);//2019-9-8 16:36:12 把空格替換為+號,+號在傳遞過程中變成了空格;
    $encryptKey = md5(rand(0, 32000));  // 用于加密的key
    $init = 0; // 初始化變量長度
    $tmp = '';
    $strLen = strlen($string); // 待加密字符串的長度
    $encryptKeyLen = strlen($encryptKey); // 加密key的長度
    for ($index = 0; $index < $strLen; $index++) {
        $init = $init == $encryptKeyLen ? 0 : $init; // 如果 $init = $encryptKey 的長度, 則 $init 清零
        // $tmp 字串在末尾增加兩位, 其第一位內容為 $encryptKey 的第 $init 位,
        // 第二位內容為 $string 的第 $index 位與 $encryptKey 的 $init 位取異或。然后 $init = $init + 1
        $tmp .= $encryptKey[$init] . ($string[$index] ^ $encryptKey[$init++]);
    }
    // 返回結果,結果為 passportKeyOp() 函數返回值的 base65 編碼結果
    return base64_encode(passportKeyOp($tmp));
}

// 密匙處理函數
function passportKeyOp($string)
{
    $encrypt_key = 'abcdefghijkl';
    $encryptKey = md5($encrypt_key); // 加密的key
    $init = 0;
    $tmp = '';
    $len = strlen($string);
    $encryptKeyLen = strlen($encryptKey);
    for ($index = 0; $index < $len; $index++) {
        $init = $init == $encryptKeyLen ? 0 : $init;
        $tmp .= $string[$index] ^ $encryptKey[$init++];
    }
    return $tmp;
}

// 解密函數
function decryptOp($string)
{
    $string = passportKeyOp(base64_decode($string));
    $tmp = '';
    $len = strlen($string);
    for ($index = 0; $index < $len; $index++) {
        if (!isset($string[$index]) || !isset($string[$index + 1])) {
            return false;
        }
        $tmp .= $string[$index] ^ $string[++$index];
    }
    return $tmp;
}
$id = "123456";
$idStr = encryptOp($id);
echo $idStr . PHP_EOL;
echo decryptOp($idStr) . PHP_EOL;

GO實現

package main

import (
	"crypto/md5"
	"encoding/base64"
	"fmt"
	"math/rand"
	"strconv"
	"strings"
	"time"
)

func Md5(str string) string {
	if str == "" {
		return ""
	}
	init := md5.New()
	init.Write([]byte(str))
	return fmt.Sprintf("%x", init.Sum(nil))
}

func MtRand(min, max int64) int64 {
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	return r.Int63n(max-min+1) + min
}

func encryptOp(str string) string {
	encryptKey := strconv.Itoa(int(MtRand(0, 32000)))
	init := 0
	tmp := ""
	strPlus := []rune(str)
	strLen := len(strPlus)
	encryptKeyPlus := []rune(encryptKey)
	encryptKeyLen := len(encryptKeyPlus)
	for index := 0; index < strLen; index++ {
		if init == encryptKeyLen {
			init = 0
		}
		strInt := int(strPlus[index])
		encryptKeyInt := int(encryptKeyPlus[init])
		tmp += string(encryptKeyPlus[init]) + string(rune(strInt ^ encryptKeyInt))

		init++
	}
	sign := passportKeyOp(tmp)
	sEnc := base64.StdEncoding.EncodeToString([]byte(sign))
	return sEnc
}

func passportKeyOp(str string) string {
	key := "abcdefghijkl"
	encryptKey := Md5(key) // 加密的key
	init := 0
	result := ""
	strPlus := []rune(str)
	strLen := len(strPlus)

	encryptKeyPlus := []rune(encryptKey)
	encryptKeyLen := len(encryptKeyPlus)

	for index := 0; index < strLen; index++ {
		if init == encryptKeyLen {
			init = 0
		}
		result += string(rune(int(strPlus[index]) ^ int(encryptKeyPlus[init])))
		init++
	}
	return result
}

func decryptOp(str string) string {
	// 把空格替換為+號,+號在傳遞過程中變成了空格
	str = strings.ReplaceAll(str, " ", "+")
	sDec, _ := base64.StdEncoding.DecodeString(str)
	str = passportKeyOp(string(sDec))
	result := ""
	strPlus := []rune(str)
	strLen := len(strPlus)
	for index := 0; index < strLen; index++ {
		result += string(rune(int(strPlus[index]) ^ int(strPlus[index+1])))
		index++
	}
	return result
}

func main() {
	id := "123456"
	idStr := encryptOp(id)
	fmt.Println("idStr = ", idStr)
	fmt.Println("id = ", decryptOp(idStr))
}

感謝各位的閱讀,以上就是“php和go按位異結果有什么不同”的內容了,經過本文的學習后,相信大家對php和go按位異結果有什么不同這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

区。| 余庆县| 临湘市| 平昌县| 沂南县| 托克逊县| 阿巴嘎旗| 南汇区| 兴义市| 宁南县| 张掖市| 浪卡子县| 宜兰市| 滦平县| 淳化县| 光山县| 长沙县| 丽水市| 正定县| 巴马| 曲松县| 宜昌市| 遵化市| 铅山县| 昌吉市| 来凤县| 井研县| 格尔木市| 上高县| 河池市| 南岸区| 会东县| 水城县| 沾益县| 大关县| 韶关市| 泰安市| 民和| 乌鲁木齐县| 东乡| 元江|