Java相当于C代码

时间:2012-01-29 13:42:36

标签: java types byte

我正在移植一个库,它以.vxl文件的形式处理从C到Java的原始字节数据。在C中,函数被传递给“unsigned char *”。什么类型最适合在Java中使用? (字节[])

另外,为什么C代码在地方访问“unsigned char *”作为数组,尽管它没有定义为它?

代码:

    MapData * load_vxl(unsigned char * v)
    {
       MapData * map = new MapData;
       if (v == NULL)
        return map;
       int x,y,z;
       for (y=0; y < 512; ++y) {
          for (x=0; x < 512; ++x) {
             for (z=0; z < 64; ++z) {
                map->geometry[get_pos(x, y, z)] = 1;
             }
             z = 0;
             for(;;) {
                int *color;
                int i;
                int number_4byte_chunks = v[0];
                int top_color_start = v[1];
                int top_color_end   = v[2]; // inclusive
                int bottom_color_start;
                int bottom_color_end; // exclusive
                int len_top;
                int len_bottom;
                for(i=z; i < top_color_start; i++)
                   map->geometry[get_pos(x, y, i)] = 0;
                color = (int *) (v+4);
                for(z=top_color_start; z <= top_color_end; z++)
                   map->colors[get_pos(x, y, z)] = *color++;
                len_bottom = top_color_end - top_color_start + 1;

                // check for end of data marker
                if (number_4byte_chunks == 0) {
                   // infer ACTUAL number of 4-byte chunks from the length of the color data
                   v += 4 * (len_bottom + 1);
                   break;
                }

                // infer the number of bottom colors in next span from chunk length
                len_top = (number_4byte_chunks-1) - len_bottom;

                // now skip the v pointer past the data to the beginning of the next span
                v += v[0]*4;

                bottom_color_end   = v[3]; // aka air start
                bottom_color_start = bottom_color_end - len_top;
                for(z=bottom_color_start; z < bottom_color_end; ++z) {
                   map->colors[get_pos(x, y, z)] = *color++;
                }
             }
          }
       }
       return map;
    }

4 个答案:

答案 0 :(得分:1)

在C中,数组 decay 成指针,指针可以引用单个项目或连续的项目集合。它们高度可互换但不一样。我们只想说两者之间的交换非常容易。

至于问题的第一部分,Java没有无符号基元,因此您必须使用加宽转换代码,即使用更大的数据类型。在这种情况下,您可能希望将代码转换为使用整数数组。

答案 1 :(得分:1)

来自你的问题:

color = (int *) (v+4);

由于v是char*,位置递增将提前32位,这正是32位机器中int的大小。因此,它增加一个“int”位置,并读取整数。

在Java代码中:

成为int v[] = new int[COLORS_QTD]你的数组。

v+4表示您希望此阵列中的第四个位置。 很简单:

color = v[4]

答案 2 :(得分:0)

  1. 是的,它可以表示为byte数组(不是Byte的数组)。
  2. C语言中的a[index]语法只是表单a + pointer_size * index的指针计算。

答案 3 :(得分:0)

  

我正在移植一个库,它以.vxl文件的形式处理从C到Java的原始字节数据。在C中,函数被传递给“unsigned char *”。什么类型最适合在Java中使用? (字节[])

您应该使用byte[],不要使用Byte [],因为它存储对象并且开销很大。在方法本身中,您可以使用ByteBuffer来包装数组,它提供了几种方法来访问存储在字节数组中的数据。

  

另外,为什么C代码在地方访问“unsigned char *”作为数组,尽管它没有定义为它?

在C中访问数组和指针以相同的方式工作。 char*指针可以指向单个或多个连续的字符(数组),编译器通过计算pointer+index来访问每个元素