-2

我正在尝试将以下函数转换为 Objective-C:

private static byte[] convertByteArray(int p_int) {
         byte[] l_byte_array = new byte[4];
         int MASK_c = 0xFF;
         for (short i = 0; i <= 3; i++) {
                l_byte_array[i] = (byte) ((p_int >> (8 * i)) & MASK_c);
         }
         return l_byte_array;
   }

我已经尝试过:

-(char *)convertByteArray:(int)p_int
{
    const char *l_byte_array[4];
    int MASK_c = 0xFF;
    for (short i = 0; i <= 3; i++) {
        l_byte_array[i] = (char *) ((p_int >> (8 * i)) & MASK_c);
    }
    return l_byte_array;
}

但我猜那是不正确的......

更新:

如果我尝试不使用 const:

-(char *)convertByteArray:(int)p_int
{
    char *l_byte_array[4];
    int MASK_c = 0xFF;
    for (short i = 0; i <= 3; i++) {
        l_byte_array[i] = (char *) ((p_int >> (8 * i)) & MASK_c);
    }
    return l_byte_array;
}

我的退货声明收到两个警告:

  1. 与返回的局部变量 '' 关联的堆栈内存地址
  2. 从结果类型为 char * 的函数返回 char[4] * 的不兼容指针类型
4

2 回答 2

2

我认为问题在于相应版本中的这两行。

爪哇:

byte[] l_byte_array = new byte[4];

Objective-C

const char *l_byte_array[4];

我相信const这意味着您无法在声明对象后对其进行编辑,这意味着您的 for 循环将无法按预期工作。删除const,看看会发生什么。

关于您的错误:

 1. address of stack memory associated with local variable '' returned
 2. incompatible pointer types returning char[4] * from a function with result type char *
  1. 您的变量是本地变量,因此当方法结束时,变量将从堆栈中释放。也许设置一个全局变量,这样你就不会丢失数据,或者不传递指针。
  2. 显然,您用于捕获返回的变量未正确声明。希望修复问题 #1 也能解决这个问题。确保声明相同,或者您至少可以将对象转换为适当的类型。
于 2014-02-25T13:57:16.730 回答
1

与返回的局部变量 '' 关联的堆栈内存地址

您不能返回指向函数的局部变量的指针,因为一旦函数返回,指针就会无效。解决方案是为字节数组分配内存并返回。

从结果类型为 char * 的函数返回 char[4] * 的不兼容指针类型

char *l_byte_array[4]是一个由 4 个指针组成的char数组,而不是一个由 4 个组成的数组char

一个可行的解决方案是

-(char *)convertByteArray:(int)p_int
{
    char *l_byte_array = malloc(4);
    int MASK_c = 0xFF;
    for (short i = 0; i <= 3; i++) {
        l_byte_array[i] = (char) ((p_int >> (8 * i)) & MASK_c);
    }
    return l_byte_array;
}

请注意,该方法的调用者在free()不再需要时必须使用内存:

char *byte_array = [self convertByteArray:some_int];
// … do something with the byte array ...
free(byte_array);

另请注意,将负数右移取决于实现,因此您可以考虑改用unsigned int参数。

于 2014-02-25T15:04:10.807 回答