Objective-C:如何创建一个从int返回UInt8数组的方法

Ada*_*dam 4 objective-c

我需要创建一个Objective-C方法,将int转换为字节数组.在这个例子中,我不能使用NSArray作为返回类型,它必须是一个UInt8数组.我写了一个简单的方法来执行此操作,但它在编译期间有错误并告诉我,我有不兼容的返回类型.这是代码片段.有任何想法吗?

 - (UInt8[])ConvertToBytes:(int) i 
{

     UInt8 *retVal[4];

     retVal[0] = i >> 24;
     retVal[1] = i >> 16;
     retVal[2] = i >> 8;
     retVal[3] = i >> 0;

     return retVal;
}
Run Code Online (Sandbox Code Playgroud)

dre*_*lax 11

返回a中的值struct.您不能从C函数返回C样式数组,这也意味着您也无法从Objective-C方法返回它们.您可以返回结构,结构允许数组作为成员.


// in a header
typedef struct
{
    UInt8 val[4];
} FourBytes;


// in source
- (FourBytes) convertToBytes:(int) i
{
     FourBytes result = { i >> 24, i >> 16, i >> 8, i };
     return result;
}



- (void) someMethod
{
    FourBytes test = [someObject convertToBytes:0x12345678];
    NSLog ("%d, %d, %d, %d", test.val[0], test.val[1], test.val[2], test.val[3]);
}

Run Code Online (Sandbox Code Playgroud)

  • 如果可以,这真的是更好的选择.结构是文明的数据结构; C阵列会让你变得笨拙. (4认同)

Chu*_*uck 6

您无法返回本地C数组.你需要malloc(sizeof(UInt8) * 4)填充它,返回指针,当然你不要忘记在完成后释放它.

下面是一个如何编写和使用它的例子(只是为了强调释放你分配的内存的重要性):

+ (UInt8 *)convertToBytes:(int)i {
    UInt8 *retVal = malloc(sizeof(UInt8) * 4);
    retVal[0] = i >> 24;
    retVal[1] = i >> 16;
    retVal[2] = i >> 8;
    retVal[3] = i >> 0;
    return retVal;
}

- (void)someMethodUsingTheOtherOne {
    int something = 900;
    UInt8 *bytesOfInt = [[self class] convertToBytes:something];
    someFunctionUsingTheBytes(bytesOFInt);
    free(bytesOfInt);
}
Run Code Online (Sandbox Code Playgroud)

(你可能会注意到我也把它改成了一个类方法.因为它不依赖于实例的任何属性,所以它更有意义的是它成为一个类方法甚至只是一个函数.但这并不是与数组和指针的工作方式有关 - 我只想在示例中使用良好的编码风格.)