싱거운 버그 문자 그룹

3965 단어

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에서 암호화 결과를 얻습니다.사고방식은 완전히 정확하지만, 운행이 끝난 후 버퍼에서 오는 것은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 유형의 버퍼이고 하나는 char 형식을 요구하는 것이다. 양자에 강제 변환을 하면 반드시 문자를 잃어버릴 것이다.그래서 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];

    //      
    [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);
        }
    }];
}

아까의 코드를 한 방법에 포장하면 그 중의 버퍼를 static 형식으로 중복 이용할 수 있고 중복 이용하는 과정에서 방법 호출이 끝난 후 두 번째로 사용할 때 버퍼에는 지난번의 데이터가 보존된다.
따라서 만약에 한 방법에서static로 수식할 수 있다면 방법이 다시 실행될 때 사용하기 전에 저장한 데이터가 정말 필요한지 확인하려면 필요하지 않으면 방법이 시작될 때 버퍼를 초기화하십시오. 예를 들어memset(buffer, 0,sizeof(uint8 t)*1024).memset을 사용하여 메모리 초기화

좋은 웹페이지 즐겨찾기