싱거운 버그 문자 그룹
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을 사용하여 메모리 초기화
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.