Как читать в Scala длинный номер, который был упакован в Python - PullRequest
3 голосов
/ 04 апреля 2019

Моя программа Scala получает (через tcp) длинный номер, упакованный в python:

Python отправляет длинные значения следующим образом:

connection.send(struct.pack("!L", 2052))

Scala получает путем чтения потока:

...
val dataInputStream = new BufferedReader(new InputStreamReader(inputStream, "ISO-8859-1"))

val buf = new Array[Char](4)
dataInputStream.read(buf,0,4)
val realLongNum = bufArrayToLongNumber(buf)

В моем массиве buf содержится число, из которого я могу самостоятельно вычислить необходимое длинное число:

def bufArrayToLongNumber(buf:Array[Char]):Long =  
  (buf(0)*256*256*256 + buf(1)*256*256 + buf(2)*256 + buf(3))

Я надеялся найти существующую функцию, которая делает этот расчет

Есть ли?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2019

Это может сработать.

val realLongNum = buf.foldLeft(0L){case (a,b) => (a<<4) + b.toLong}
3 голосов
/ 05 апреля 2019

BigInt на самом деле имеет конструктор, который принимает Array[Byte] (так что вам нужно будет выполнить преобразование из Array[Char]):

val bi = BigInt(buf.map(_.toByte))

Это также будет обрабатывать ситуацию, когда ваш номер не 'Лонг.Вы также можете получить Long, просто позвонив по номеру bi.longValue.

Если вы уверены, что ваш номер всегда будет соответствовать Long, я не уверен, что это лучшее решение, чем ваше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...