Преобразовать целое число в байтовый массив (Java)

  1. Убедитесь, что имена свойств совпадают между javascript и моделью C #. В вашем вопросе у вас были Propr1 и Propr2 для объекта javascript, но в модели C # у вас были Prop1 и Prop2 (отсутствует «r»).
  2. Не stringify перед отправкой данных и не устанавливайте dataType на json. MVC может отлично разбираться с набором параметров сообщений без сериализации json в вашем коде.
  3. Опустить contentType, это необязательно. WebAPI должен автоопределить это.

Javascript Клиентская сторона:

    var myData = {Prop1: '', Prop2: ''}; // #1
    $.ajax({
        type: 'POST',
        data: myData, // #2
        url: '/Home/SubmitMyData',
        //contentType: 'application/json', #3
        //dataType: 'json', #2
        success: alert('Youhou'),
        error: alert('not good')
    });

C # Метод на стороне сервера:

    public ActionResult SubmitMyData(MyParamModel myParam)
    {
        // Do my stuff here with my parameter
        return View();
    }

    public class MyParamModel // #4
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
    }
129
задан azro 24 February 2018 в 10:36
поделиться

4 ответа

Взгляните на класс ByteBuffer .

ByteBuffer b = ByteBuffer.allocate(4);
//b.order(ByteOrder.BIG_ENDIAN); // optional, the initial order of a byte buffer is always BIG_ENDIAN.
b.putInt(0xAABBCCDD);

byte[] result = b.array();

Установка порядка байтов гарантирует, что result [0] == 0xAA , result [1] == 0xBB , result [2] == 0xCC и result [3] == 0xDD .

Или же вы можете сделать это вручную:

byte[] toBytes(int i)
{
  byte[] result = new byte[4];

  result[0] = (byte) (i >> 24);
  result[1] = (byte) (i >> 16);
  result[2] = (byte) (i >> 8);
  result[3] = (byte) (i /*>> 0*/);

  return result;
}

Класс ByteBuffer был разработан для таких «грязных» задач. Фактически, частный java.nio.Bits определяет эти вспомогательные методы, которые используются ByteBuffer.putInt () :

private static byte int3(int x) { return (byte)(x >> 24); }
private static byte int2(int x) { return (byte)(x >> 16); }
private static byte int1(int x) { return (byte)(x >>  8); }
private static byte int0(int x) { return (byte)(x >>  0); }
225
ответ дан 24 November 2019 в 00:29
поделиться

Простое решение, которое правильно обрабатывает ByteOrder:

ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()).putInt(yourInt).array();

0
ответ дан 24 November 2019 в 00:29
поделиться

Использование BigInteger :

private byte[] bigIntToByteArray( final int i ) {
    BigInteger bigInt = BigInteger.valueOf(i);      
    return bigInt.toByteArray();
}

Использование DataOutputStream :

private byte[] intToByteArray ( final int i ) throws IOException {      
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(bos);
    dos.writeInt(i);
    dos.flush();
    return bos.toByteArray();
}

Использование ByteBuffer :

public byte[] intToBytes( final int i ) {
    ByteBuffer bb = ByteBuffer.allocate(4); 
    bb.putInt(i); 
    return bb.array();
}
35
ответ дан 24 November 2019 в 00:29
поделиться

Вы можете использовать BigInteger :

Из целых чисел:

byte[] array = BigInteger.valueOf(0xAABBCCDD).toByteArray();
System.out.println(Arrays.toString(array))
// --> {-86, -69, -52, -35 }

Возвращаемый массив имеет размер, необходимый для представления числа, поэтому он может иметь размер 1, например, для обозначения 1. Однако размер не может быть больше четырех байтов, если передается int.

From Strings:

BigInteger v = new BigInteger("AABBCCDD", 16);
byte[] array = v.toByteArray();

Однако вам нужно будет следить, если первый байт больше 0x7F (как и в данном случае), где BigInteger вставит байт 0x00 в начало массива. Это необходимо, чтобы различать положительные и отрицательные значения.

8
ответ дан 24 November 2019 в 00:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: