Сетевое взаимодействие между сервером C # и клиентом JAVA: как с этим справиться. переход? - PullRequest
0 голосов
/ 02 октября 2011

Итак, У меня есть сервер C #, который нельзя изменить. В C # байт находится в диапазоне от 0 до 255, а в JAVA - от -128 до 127.

Я прочитал о проблеме с неподписанным байтом / ints / etc, и единственная реальная возможность, которую я обнаружил, состоит в том, чтобы использовать «больше памяти» для представления неподписанной вещи: http://darksleep.com/player/JavaAndUnsignedTypes.html

Это правда?

Таким образом, имея сетевую связь между клиентом JAVA и сервером C #, клиент JAVA получает массивы байтов с сервера. Сервер отправляет их «как неподписанные», но при получении они будут интерпретироваться как подписанные байты, верно?

Должен ли я затем типизировать каждый байт в Int, а затем добавить 127 к каждому из них?

Я не уверен, что здесь ... но как мне интерпретировать его обратно в те же значения (int, строки и т. Д.), Которые были у меня на сервере C #?

Я нахожу всю эту ситуацию крайне запутанной (не говоря уже о проблемах с порядком байтов, но это для другого поста).

Любые советы и идеи будут великолепны.

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

Байт в C # равен 0-255, а не 0-254.

Однако в большинстве случаев вам не нужно беспокоиться - в основном в C # и Java байт составляет 8 бит. Если вы отправите байтовый массив из C #, вы получите те же биты в Java и наоборот. Если затем преобразовать части этого байтового массива в 32-разрядные целые числа, строки и т. Д., Все будет работать нормально. Подпись байтов в Java почти всегда не имеет значения - только если вы обрабатываете их численно , это является проблемой.

В чем больше проблемы - это вероятность различного порядка байтов при (скажем) преобразовании 32-разрядного целого числа в 4 байта в Java и последующем чтении данных в C # или наоборот. Вам нужно будет предоставить больше информации о том, что вы пытаетесь сделать, чтобы мы могли помочь вам в этом. В частности, у вас уже есть протокол, который вы должны придерживаться? Если так, то это в значительной степени решает, что вам нужно делать - и насколько это будет сложно, зависит от того, какой протокол.

Если вы доберетесь до и выберете протокол, вы можете использовать независимый от платформы формат сериализации, такой как Протокол буфера , который доступен для .NET и Java. *

1 голос
/ 02 октября 2011

К сожалению, да ... ответ заключается в том, чтобы "использовать больше памяти", по крайней мере, на каком-то уровне.

Вы можете хранить данные в виде массива byte в java, но когда вам нужно использовать эти данные численно, вам нужно перейти к int и добавить 256к отрицательным значениям.Побитовый & сделает это для вас быстро и эффективно.

int foo;
if (byte[3] < 0)
    foo = (byte[3] & 0xFF);
else
    foo = byte[3];
...