Java-эквивалент кода C - PullRequest
       18

Java-эквивалент кода C

1 голос
/ 29 января 2012

Я портирую библиотеку, которая манипулирует необработанными байтовыми данными в виде файла .vxl из C в Java. В C функции передается "unsigned char *". Какой тип лучше всего использовать в Java? (Byte []?)

Кроме того, почему код 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 ]

1 голос
/ 29 января 2012

В C массивы распадаются на указатели, и указатели могут ссылаться либо на один элемент, либо на непрерывный набор элементов. Они взаимозаменяемы, но не одинаковы. Давайте просто скажем, что их очень легко поменять местами.

Что касается первой части вашего вопроса, Java не имеет беззнаковых примитивов, поэтому вам придется конвертировать код, используя , расширяющий , то есть, используя больший тип данных. В этом случае вы захотите преобразовать код для использования массива целых чисел.

1 голос
/ 29 января 2012

из вашего вопроса:

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

Поскольку v - это char*, с приращением позиций будет идти вперед на 32 бита, что в точности равно int на 32-битной машине. Таким образом, он увеличивает одну позицию «int» и читает как целое число.

в коде Java:

является int v[] = new int[COLORS_QTD] вашим массивом.

v+4 означает, что вы хотите четвертую позицию в этом массиве. это просто:

color = v[4]
0 голосов
/ 29 января 2012

Я портирую библиотеку, которая обрабатывает необработанные байтовые данные в виде файла .vxl из C в Java. В C функции передается "unsigned char *". Какой тип лучше всего использовать в Java? (Byte []?)

Вы должны взять byte[], не использовать Byte [], поскольку он хранит объекты и имеет большие накладные расходы. В самом методе вы можете использовать ByteBuffer для переноса массива, он предоставляет несколько методов для доступа к данным, хранящимся в байтовом массиве.

Кроме того, почему код C получает доступ к "unsigned char *" как массиву местами, хотя он не определен как он?

В C доступ к массиву и указателю работает одинаково. Указатель char* может указывать на один или несколько последовательных символов (массив), компилятор обращается к каждому элементу, вычисляя pointer+index

0 голосов
/ 29 января 2012
  1. да, это может быть выражено как массив byte (не массив Byte с).
  2. Синтаксис a[index] в C - это не что иное, как вычисление указателя в форме a + pointer_size * index.
...