美文网首页
扯淡的bug之字符数组

扯淡的bug之字符数组

作者: 7分醉 | 来源:发表于2016-02-26 15:28 被阅读67次

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];

    //调用加密接口
    [TestAPI encryptData:@"test" inputStream:inputStream outputStream:outputStream block:^(ResultCode code) {
        if (SUCCESS == code) {
            //成功,从buffer中获取数据
            NSString *str = [[NSString alloc] initWithCString:buffer encoding:NSUTF8StringEncoding];
            NSLog(@"成功!!!=%@", str);
        } else {
            //失败
            NSLog(@"失败 error=%hu", code);
        }
    }];

这段代码调用接口方法进行加密,该方法主要有inputStream和outputStream,要加密的内容通过inputStream输入进去,加密结果通过outputStream输出,我们将输出流输出到一个buffer,调用成功后,从buffer中获取加密结果。
思路完全正确,可是运行结束后从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 类型的,两者进行强制转换必定会丢失字符。所以导致 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];

    //调用加密接口
    [TestAPI encryptData:@"test" inputStream:inputStream outputStream:outputStream block:^(ResultCode code) {
        if (SUCCESS == code) {
            //成功,从buffer中获取数据
            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);
        }
    }];

静态数组的重复利用

- (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];

    //调用加密接口
    [TestAPI encryptData:@"test" inputStream:inputStream outputStream:outputStream block:^(ResultCode code) {
        if (SUCCESS == code) {
            //成功,从buffer中获取数据
            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);
        }
    }];
}

将刚才的代码包装在一个方法里其好处是可以实现重复利用
其中的 bufferstatic 类型,在重复利用的过程中,方法调用结束后第二次使用时 buffer 中还会保留上次的数据。

所以如果在一个方法中有用到 static 来修饰,要明确是否真的需要在方法再次运行时使用之前保存的数据,如果不需要,请在方法开始时对 buffer 进行初始化,例如:
memset(buffer, 0, sizeof(uint8_t) * 1024);
使用 memset 进行内存初始化

相关文章

  • 扯淡的bug之字符数组

    char与unsigned char 话不多说,先上代码。。。 这段代码调用接口方法进行加密,该方法主要有inpu...

  • 再学C语言之指针要点

    C之字符数组 C之指针引用字符串 C语言之数组指针 数组指针:首先它是一个指针,它指向数组指针数组:首先它是一个数...

  • 标题

    找bug找bug输入超级长的字符串 找bug找bug输入超级长的字符串 找bug找bug输入超级长的字符串 找bu...

  • C语言-字符数组

    用来存放字符量的数组称为字符数组。 1 字符数组的定义 1. 字符数组的定义 字符数组的定义和整型数组的定义是相同...

  • 八月二十五

    PHP数组之关联数组初始化 关联数组是指数组的键是字符串的数组。 $fruit = array( 'apple'=...

  • 2017年9月15日 学习报告

    今天学习了字符数组,用来存放字符数据的数组就是字符数组。字符数组中的一个元素存放一个字符。定义字符数组的方...

  • JS基础09-17

    数组面向对象创建 直接创建 数组嵌套 数组字符拼接 数组去重 字符串字符串翻转/字符串翻转---线分割数组,翻转,...

  • C++ 学习笔记之——字符串和字符串流

    1. 字符数组 字符数组,也就是存放字符类型数据的数组,只不过字符数组的结尾必须是 '\0'。C++ 已经提供了一...

  • JavaScript字符串对象与Date

    指用来存放字符的数组,字符数组的定义:用来存放字符量的数组称为字符数组。 当我们在使用字符串时,可以直接用基本类型...

  • C语言入门开发-字符数组

    字符数组所有的元素都是字符,数组右的特点字符数组都右,但是也有一些自己独特的地方 1、字符数组数据类型 数组名[元...

网友评论

      本文标题:扯淡的bug之字符数组

      本文链接:https://www.haomeiwen.com/subject/bkhwkttx.html