将Java方法转换为Objective C

时间:2014-02-25 13:52:17

标签: java objective-c converter

我正在尝试将以下函数转换为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. 相关联的堆栈内存的地址
  3. 不兼容的指针类型从结果类型为char *
  4. 的函数返回char [4] *

2 个答案:

答案 0 :(得分:2)

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

爪哇:

byte[] l_byte_array = new byte[4];

目标-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也能解决这个问题。确保声明相同,或者至少可以将对象强制转换为适当的类型。

答案 1 :(得分:1)

  

与本地变量“'返回

相关联的堆栈内存的地址

您不能返回指向函数局部变量的指针,因为指针 函数返回后将立即失效。 解决方案是为字节数组分配内存并返回该内存。

  

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

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参数。