Как следовать биту C ++ в Java? - PullRequest
2 голосов
/ 09 мая 2011

если у меня в c ++:

char abc[4];

abc[0] = 0xC0; //11000000 in binary

abc[1] = 0x20; //00100000 in binary

abc[2] = 0x44; //01000100 in binary

abc[3] = 0x20; //00100000 in binary

Так как это будет храниться в памяти -

11000000 00100000 01000100 00100000 or the reverse way ??
----------------------------------- 
   0th      1st     2nd      3rd

В Java я создаю Bitset abc = new Bitset(32);

Поэтому мне нужно хранить те же значения в этом (том же порядке). Это может быть изменено позже в соответствии с позициями битов, поэтому должно быть точно таким же образом.

Так что abc[32] = 0xC0204420 подойдет?И если я хочу хранить значения в C ++, что делать ??Если я не прав, то как это сделать на Java ...

Ответы [ 3 ]

1 голос
/ 09 мая 2011

Endian не проблема.Если вы используете char[4], наименьший адрес 0 будет первым, наибольший 3 будет последним, поэтому вы получите в памяти

char[0] char[1] char[2] char[3]

, что бы вы ни делали.

Если вы выполните int x = *(reinterpret_cast<int*>(abc)), тогда вы получите разные результаты, в зависимости от порядка байтов, потому что (4byte-) int иногда читается как 0123, иногда 3210 - и я думаю, что даже 2301 имеетбыл в 60-х годах.

Вы не можете поместить 0xC0204420 (большее число, чем 127) в [32] тыс. позицию abc.Если вы хотите реализовать что-то «быстрое» (и опасное), вам понадобится зависящий от платформы reinterpret_cast.Взгляните на hton и ntoh.

1 голос
/ 09 мая 2011

Да, именно так C ++ представляет массив char в памяти.

Что касается Java, то оно совершенно произвольно.Это зависит от того, как вы определяете отображение между индексом в вашем Bitset и байтовым / битовым индексом в C ++ «представлении».Вы можете определить это отображение любым способом, если хотите.

0 голосов
/ 09 мая 2011

Если вы создадите char abc[4]; и заполните его символ за символом, то да, в памяти это будет представлено как 11000000 00100000 01000100 00100000.

Проблема, которую я вижу с Java BitSet, заключается в том, что содержимое BitSet не может быть представлено просто как число - для него нет метода, так как бы вы конвертировали 0xC0204420 в BitSet или как бы вы представляли BitSet как номер как 0xC0204420? Одна возможность состоит в том, чтобы взять каждые восемь битов из BitSet, сделать из них char (используя битовые операторы Java, такие как << и |), а затем создать некоторый массив символов или что-то из них, которое должно быть равным предыдущему C ++ char[4].

...