扯淡的bug之字符數(shù)組

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)換必定會丟失字符。所以導致 strnull

對代碼更改如下

    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)重復利用
其中的 bufferstatic 類型,在重復利用的過程中,方法調(diào)用結(jié)束后第二次使用時 buffer 中還會保留上次的數(shù)據(jù)。

所以如果在一個方法中有用到 static 來修飾,要明確是否真的需要在方法再次運行時使用之前保存的數(shù)據(jù),如果不需要,請在方法開始時對 buffer 進行初始化,例如:
memset(buffer, 0, sizeof(uint8_t) * 1024);
使用 memset 進行內(nèi)存初始化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容