문제

나는 변환하고 싶다 NSData 바이트 배열로 다음 코드를 작성합니다.

NSData *data = [NSData dataWithContentsOfFile:filePath];
int len = [data length];
Byte byteData[len];
byteData = [data bytes];

그러나 마지막 코드 줄은 "과제에서 호환되지 않는 유형"이라는 오류가 나타납니다. 그러면 데이터를 바이트 배열로 변환하는 올바른 방법은 무엇입니까?

도움이 되었습니까?

해결책

변수를 사용하여 배열을 선언 할 수 없습니다 Byte byteData[len]; 작동하지 않습니다. 포인터에서 데이터를 복사하려면 Memcpy (포인터가 가리키는 데이터를 통해 각 바이트를 지정된 길이까지 복사 할 것임)도 필요합니다.

노력하다:

NSData *data = [NSData dataWithContentsOfFile:filePath];
NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);

이 코드는 배열을 올바른 크기로 동적으로 할당합니다 ( free(byteData) 완료되면) 바이트를 복사하십시오.

당신은 또한 사용할 수 있습니다 getBytes:length: 고정 길이 배열을 사용하려는 경우 다른 사람이 표시합니다. 이것은 malloc/free를 피하지만 확장 가능성이 떨어지고 오버플로 문제를 버퍼하기 쉽기 때문에 거의 사용하지 않습니다.

다른 팁

바이트 만 사용하여 필요한 유형에 시전 할 수 있습니다.

unsigned char *bytePtr = (unsigned char *)[data bytes];

이미 대답했지만 다른 독자들을 돕기 위해 일반화하기 위해 :

    //Here:   NSData * fileData;
    uint8_t * bytePtr = (uint8_t  * )[fileData bytes];

    // Here, For getting individual bytes from fileData, uint8_t is used.
    // You may choose any other data type per your need, eg. uint16, int32, char, uchar, ... .
    // Make sure, fileData has atleast number of bytes that a single byte chunk would need. eg. for int32, fileData length must be > 4 bytes. Makes sense ?

    // Now, if you want to access whole data (fileData) as an array of uint8_t
    NSInteger totalData = [fileData length] / sizeof(uint8_t);

    for (int i = 0 ; i < totalData; i ++)
    {
        NSLog(@"data byte chunk : %x", bytePtr[i]);
    }

서명 -[NSData bytes] ~이다 - (const void *)bytes. 스택의 배열에 포인터를 할당 할 수 없습니다. 관리하는 버퍼를 복사하려면 NSData 배열에 객체를 사용하십시오 -[NSData getBytes:]. 복사하지 않고 수행하려면 배열을 할당하지 마십시오. 포인터 변수를 선언하고하자 NSData 당신을 위해 메모리를 관리하십시오.

Data Bytes]의 리턴 유형은 UINT8이 아닌 무효* C 스타일 배열이기 때문입니다 (바이트가 typedef의 바이트입니다).

오류는 반환이 포인터 유형 일 때 할당 된 배열을 설정하려고하기 때문에, 당신이 찾고있는 것은 getbytes : length : call은 다음과 같습니다.

[data getBytes:&byteData length:len];

NSDATA 객체의 데이터를 할당 한 배열을 채 웁니다.

내가 믿는 것은 다음과 같은 것입니다.

if let data = NSData(contentsOfFile: filePath) {
   let length = data.length
   let byteData = malloc(length)
   memcmp(byteData, data.bytes, length)
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top