Совместимость массива байтов со знаком Java с массивом байтов .Net

У нас есть служба Java Rest с использованием трикотажа.

Я получаю целочисленные данные в виде массива байтов со встроенным в него CRC. Он принимает ввод как Plain_text, а переменная имеет тип string.

Нам нужно перепроверить значения CRC.

Поскольку он исходит из приложения .Net, в котором все значения будут от 0 до 255 (массив байтов со знаком), а в Java - от -127 до 128 (массив байтов со знаком).

Итак, мне нужно предложение о том, как мне преобразовать массив байтов без знака в массив байтов со знаком в Java?

Другие проблемы, с которыми я сталкиваюсь:

  1. Всякий раз, когда есть значение больше 127, тогда в java будет отображаться нежелательное значение или 63 (постоянное значение, не знаю почему).

  2. Я нахожу довольно странным, что значения меньше 127, но значения CRC находятся на другой стороне.

Я надеюсь, что я ясно изложил свой вопрос и дать предложение.

Так как его массив anding (& 0xFF) очень большой, этого бы не произошло. Так как у нас большой размер массива.


person Bharath Kmr    schedule 30.01.2014    source источник
comment
Как выглядит ввод? Вы говорите, что это строка, это строка чисел от 0 до 255?   -  person Maurício Linhares    schedule 30.01.2014
comment
@POST @Path(/{ID}) @Produces(text/plain;charset=utf-8) @Consumes(text/plain) public Response pullservice(@PathParam(ID) String deviceID, String data){ . data является входным параметром в методе. но что требуется для целых чисел, которые закодированы массивом байтов. Работает отлично. Но нужно добавить проверку CRC с помощью SHA-256. Отсюда проблема совместимости между .net и java.   -  person Bharath Kmr    schedule 31.01.2014


Ответы (1)


Чтобы преобразовать массив байтов со знаком в беззнаковый, я использовал:

private static void printByteArrayFromSigned(byte[] arr) {

    if(arr == null || arr.length == 0){
        logger.debug("Array vuoto");
        return;
    }
    StringBuilder sb = new StringBuilder();
    for(byte b : arr)   {
        int x = b;
        if(x<0){
            x+=256;
            sb.append("["+x+"]* ");
        }else{
            sb.append("["+x+"] ");
        }
    }
    logger.debug(sb.toString());
}
//* converted

Наоборот, от беззнакового до знакового массива байтов используйте:

private static void printByteArrayFromUnsigned(byte[] arr) {

    if(arr == null || arr.length == 0){
        logger.debug("Array vuoto");
        return;
    }
    StringBuilder sb = new StringBuilder();
    for(byte b : arr)   {
        int x = b;
        if(x>127){
            x-=256;
            sb.append("["+x+"]* ");
        }else{
            sb.append("["+x+"] ");
        }
    }
    logger.debug(sb.toString());
}

//* converted
person Marco S.    schedule 22.04.2015