事情的起因是這樣的吴裤,這兩天正在做一個功能坏为,考慮到數(shù)據(jù)的保密性和服務(wù)端商量后決定用DES加密數(shù)據(jù)。我手里目前有兩個3DES加密的源碼弦疮,一個是使用過且沒有問題,另一個是別處得來的蜘醋,我打算修改為DES的版本來使用胁塞,抉擇后選擇了第二個,因為第二個代碼的看著整潔、干凈啸罢,功能實現(xiàn)的好像還不錯编检,然后就開始有問題了。
測試了一下伺糠,對同一字符串使用相同的key每次加密得到的結(jié)果不一樣蒙谓,這肯定是錯誤的,直接就否定了第二段代碼训桶,任務(wù)要緊累驮,先用第一個吧。等把功能寫好之后舵揭,想探究一下第二段代碼的問題谤专,當(dāng)然,第二段中有很多問題午绳,就不一一說了置侍。
在修改第二段代碼的過程中,發(fā)現(xiàn)在將一個NSString對象轉(zhuǎn)換為C字符串的過程中拦焚,兩段代碼使用了不同的方法蜡坊。
NSString *key = @"1234abcd";
NSData *data =[key dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%s %s", [key UTF8String], data.bytes);
我嘗試打印了一下兩者的值,竟然不是一樣的赎败。秕衙。。
而且使用
data.bytes
得到的值每次都是不一樣的僵刮,有時正確据忘,有時在尾部會多出來一些數(shù)據(jù),就像上圖一樣搞糕。但不管怎么樣都是以key的值為開頭勇吊,這就解釋了為什么第二段代碼每次的值都會不一樣了,因為每次的key都是不相同的窍仰。為什么
data.bytes
每次的值不一樣呢汉规?點開bytes
可以看到這么一句話。
The -bytes method returns a pointer to a contiguous region of memory managed by the receiver .
大意為:bytes
方法指向接收者管理的一段連續(xù)的內(nèi)存驹吮。既然為連續(xù)的內(nèi)存鲫忍,可能就會包含NSData的其他字段所占用的內(nèi)存,這樣后邊的總是有追加的莫名字符就可以解釋的通了钥屈。如何證明呢?
在
NSLog
下一行添加一個斷點坝辫,讓程序跑起來篷就。
此時看到已經(jīng)打印出了值,第二個后面多出來一個大寫的A
近忙。
在控制面板右擊data
出現(xiàn)下面這個面板竭业,然后點擊View Memory of "data"
進入下圖:
這些是程序運行的產(chǎn)生的數(shù)據(jù)智润,在畫紅線的地方將
_bytes
的十六進制地址輸入進去會看到_bytes
內(nèi)存段的數(shù)據(jù)。我這里是0x1002008e0未辆。
可以看到最上面一行就是
_bytes
的值了窟绷,正是1234abcsA
的值。前面對應(yīng)的是內(nèi)存中的ascii值咐柜,由于是十六進制兼蜈,需要轉(zhuǎn)為十進制查看。1234abcsA
后面是一段空的內(nèi)存拙友,正驗證了官方文檔上說的:bytes方法指向接收者管理的一段連續(xù)的內(nèi)存为狸。