char與unsigned char
話不多說,先上代碼。。。
NSString *inputString = [NSString stringWithFormat:@"dddddddddddd"];//要加密的字符串
NSInputStream *inputStream = [[NSInputStream alloc] initWithData:[inputString dataUsingEncoding:NSUTF8StringEncoding]];
//輸出到字符串
static uint8_t buffer[1024];
NSOutputStream *outputStream = [[NSOutputStream alloc] initToBuffer:buffer capacity:1024];
//調(diào)用加密接口
[TestAPI encryptData:@"test" inputStream:inputStream outputStream:outputStream block:^(ResultCode code) {
if (SUCCESS == code) {
//成功,從buffer中獲取數(shù)據(jù)
NSString *str = [[NSString alloc] initWithCString:buffer encoding:NSUTF8StringEncoding];
NSLog(@"成功?。?!=%@", str);
} else {
//失敗
NSLog(@"失敗 error=%hu", code);
}
}];
這段代碼調(diào)用接口方法進行加密,該方法主要有inputStream和outputStream,要加密的內(nèi)容通過inputStream輸入進去,加密結(jié)果通過outputStream輸出,我們將輸出流輸出到一個buffer,調(diào)用成功后,從buffer中獲取加密結(jié)果。
思路完全正確,可是運行結(jié)束后從buffer中的到的卻是null。
其原因就在下面這兩行代碼上
static uint8_t buffer[1024];
...
NSString *str = [[NSString alloc] initWithCString:buffer encoding:NSUTF8StringEncoding];
其中
typedef unsigned char uint8_t;
- (nullable instancetype)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
可以看出,其中的類型不同,一個是unsigned char 類型的 buffer 一個是要求 char 類型的,兩者進行強制轉(zhuǎn)換必定會丟失字符。所以導致 str 為 null
對代碼更改如下
NSString *inputString = [NSString stringWithFormat:@"dddddddddddd"];//要加密的字符串
NSInputStream *inputStream = [[NSInputStream alloc] initWithData:[inputString dataUsingEncoding:NSUTF8StringEncoding]];
//輸出到字符串
static uint8_t buffer[1024];
NSOutputStream *outputStream = [[NSOutputStream alloc] initToBuffer:buffer capacity:1024];
//調(diào)用加密接口
[TestAPI encryptData:@"test" inputStream:inputStream outputStream:outputStream block:^(ResultCode code) {
if (SUCCESS == code) {
//成功,從buffer中獲取數(shù)據(jù)
NSData *data = [NSData dataWithBytes:buffer length:strlen(buffer)];
//進行base64編碼以方便顯示
data = [GTMBase64 encodeData:data];
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"成功?。?!=%@", str);
} else {
//失敗
NSLog(@"失敗 error=%hu", code);
}
}];
靜態(tài)數(shù)組的重復利用
- (void)testFunction
{
NSString *inputString = [NSString stringWithFormat:@"dddddddddddd"];//要加密的字符串
NSInputStream *inputStream = [[NSInputStream alloc] initWithData:[inputString dataUsingEncoding:NSUTF8StringEncoding]];
//輸出到字符串
static uint8_t buffer[1024];
//memset(buffer, 0, sizeof(uint8_t) * 1024);
NSOutputStream *outputStream = [[NSOutputStream alloc] initToBuffer:buffer capacity:1024];
//調(diào)用加密接口
[TestAPI encryptData:@"test" inputStream:inputStream outputStream:outputStream block:^(ResultCode code) {
if (SUCCESS == code) {
//成功,從buffer中獲取數(shù)據(jù)
NSData *data = [NSData dataWithBytes:buffer length:strlen(buffer)];
//進行base64編碼以方便顯示
data = [GTMBase64 encodeData:data];
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"成功?。。?%@", str);
} else {
//失敗
NSLog(@"失敗 error=%hu", code);
}
}];
}
將剛才的代碼包裝在一個方法里其好處是可以實現(xiàn)重復利用
其中的 buffer 為 static 類型,在重復利用的過程中,方法調(diào)用結(jié)束后第二次使用時 buffer 中還會保留上次的數(shù)據(jù)。
所以如果在一個方法中有用到 static 來修飾,要明確是否真的需要在方法再次運行時使用之前保存的數(shù)據(jù),如果不需要,請在方法開始時對 buffer 進行初始化,例如:
memset(buffer, 0, sizeof(uint8_t) * 1024);
使用 memset 進行內(nèi)存初始化