Как преобразовать байты Java в быстрый int

Я использую GCDAsyncSocket для достижения сокета в iOS, я получаю заголовок пакета, сначала использую socket.readData(toLength: 5, withTimeout: -1, tag: 0), затем я вычисляю длину тела в делегате didRead и использую socket.readData(toLength: bodySize, withTimeout: -1, tag: 0) для продолжения получения пакета тела

Головка пакета сокета имеет 5 байтов: байты [0] — это тип, а остальные четыре байта — размер тела.

Размер конвертируется из Int в байты в java

 byte[] header = new byte[5];
 header[0] = type; //package type 
 header[1]=(byte) ((length>>24)&0xff);  //package size 
 header[2]=(byte) ((length>>16)&0xff);  //package size
 header[3]=(byte) ((length>>8)&0xff);  //package size
 header[4]=(byte) (length&0xff);       //package size
 return header;

В swift я использую let bytes = [UInt8](data) для преобразования данных в байты в socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int), потому что массив байтов в swift имеет значение UInt8 и отличается от java-байтов (-127 ~ 127). Поэтому я хочу знать, как преобразовать байты размера в Int


person jansma    schedule 29.04.2020    source источник


Ответы (1)


Когда у вас есть 5 байтов в Data, вам не нужно преобразовывать его в Array.

Вы можете написать что-то вроде этого:

let length = UInt32(data[1]) << 24 | UInt32(data[2]) << 16 | UInt32(data[3]) << 8 | UInt32(data[4])

Есть и другие способы, но этот код подходит для обратной операции вашего Java-кода.

person OOPer    schedule 29.04.2020