[問題] 替代式加密算法之解碼
這問題我常遇到,只舉一個應用當引文例子,然後請別受限在只有 256 個元素,
因其它例子的情況資料量會更大。
問題是這樣的,我必須對字串加密,加密後還必須是可視字元 ( isprint(ch)==true ),
為了加快加密之速度,我建了份 table, c約如下。
typedef unsigned char byte; ///< 因會拿來當索引,所以宣告成 unsigned char
byte enMapping[256] ;
for(i = 0 ; i < 256 ; ++i) enMapping[i] = i;
// ASCII 0x2E~0x7F 為可視字元,對這範圍做洗牌動作
shuffle(enMapping+0x2E, enMapping + (0x7F-0x2E+1) );
// 加密函式
void Encryption( byte * pszSrc , byte * pszEn , byte * enMapping)
{
while(*pszSrc)
*pszEn++ = enMapping[*pszSrc++];
}
解密也是一樣用 mapping 的方式進行,所以要從 byte enMapping[256] 產生出
byte deMapping[256],目前的 Code 是直接調用 qsort , 這動作還蠻頻繁使用的,
但我覺得以這例子 "好像" 有比 qsort 還快之排序法,約如下面的方式。
void GenerateDeMapping(char * enMapping , char * deMapping)
{
int i, j;
byte tmpMapping[256], tmp;
// 備份,避免把 enmapping 洗亂
memcpy( (void*)tmpMapping , (const void*)enMapping , 256 );
for(i = 0 ; i < 256 ; ++i) deMapping[i] = i;
for(j = 0x2E ; j <= 0x7F ; ++j){
// 交換到對的位置為止
while( (tmp = tmpMapping[j]) != j) {
swap(tmpMapping[tmp], tmpMapping[j]) ;
swap(deMapping[tmp], deMapping[j]) ;
}
}
}
這裡就產生了解碼用的 mapping 了。再化簡一下問題,
Q : 假設一個整數陣列裡面,每個數字都只出現過一次,
是否有較特殊之排序法能較快完成上述動作?
謝謝各位不吝賜教,感激不盡。
--
~ 這輩子與神手無緣
我只好當神獸了 ~
卡卡獸
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.74.188
→
01/04 23:26, , 1F
01/04 23:26, 1F
→
01/04 23:26, , 2F
01/04 23:26, 2F
→
01/04 23:31, , 3F
01/04 23:31, 3F
→
01/04 23:32, , 4F
01/04 23:32, 4F
推
01/04 23:33, , 5F
01/04 23:33, 5F
→
01/04 23:34, , 6F
01/04 23:34, 6F
→
01/04 23:37, , 7F
01/04 23:37, 7F
推
01/04 23:42, , 8F
01/04 23:42, 8F
→
01/04 23:42, , 9F
01/04 23:42, 9F
→
01/04 23:45, , 10F
01/04 23:45, 10F
→
01/05 13:39, , 11F
01/05 13:39, 11F
推
01/05 14:41, , 12F
01/05 14:41, 12F
推
01/05 16:49, , 13F
01/05 16:49, 13F
→
01/05 19:40, , 14F
01/05 19:40, 14F
推
01/05 20:15, , 15F
01/05 20:15, 15F
推
01/05 21:48, , 16F
01/05 21:48, 16F
推
01/05 22:15, , 17F
01/05 22:15, 17F
→
01/05 22:16, , 18F
01/05 22:16, 18F
→
01/05 23:37, , 19F
01/05 23:37, 19F
→
01/05 23:37, , 20F
01/05 23:37, 20F
→
01/06 00:47, , 21F
01/06 00:47, 21F
→
01/06 00:47, , 22F
01/06 00:47, 22F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章