我正在移植一个库,它以.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;
}
答案 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)
byte
数组(不是Byte
的数组)。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
来访问每个元素