2015-07-20 3 views
0

Ive работает над приложением, которое работает с довольно низкоуровневой сетью, т.е. чтение byte[] из входного потока и отправка byte[] в выходной поток, где массивы байтов находятся в очень специфическом формате.Groovy - добавить явные массивы, т. Е. Массивы java

Теперь я написал много кода в предположении, что я могу просто добавлять массивы с +, который, как я только что узнал сейчас, не возможен - работает только с def a = [], так как это список.

Это означает, что теперь мой проект полон кода, как

public byte[] getHeaderBytes(){ 
    return MessageUtils.toBytesUINT(messageLength) + MessageUtils.toBytesUINT(messageType) 
} 

где метод также работает на добавление как

public static byte[] toBytesUINT(long... longs){ 
    byte[] rv = new byte[0] 
    longs.each{ 
     byte[] arr = Longs.toByteArray(it) 
     rv += arr[arr.size()-4 .. arr.size()-1] 
     } 
    return rv 
} 

(здесь им-хранение без знака имеет длину 4 байта целое в длинные, получение байты для длинного использования с помощью Guava, а затем получение 4 наименее значимых байтов, которые представляют беззнаковый int)

Теперь, мой вопрос: как мне обратиться к исправлению мой код с наименьшим количеством перезаписи и/или сделать это в элегантном стиле Groovy?

EDIT: после выполнения еще несколько тестов, он является возможно с массивом объектов, но не примитивные массивы, то есть с кодом

String[] testArray = ["A", "B", "C"] 
String[] testArray2 = ["D", "E"] 
println testArray + testArray2 

Byte[] testArray5 = [0, 1, 2] 
Byte[] testArray6 = [3, 4] 
println testArray5 + testArray6 

byte[] testArray3 = [0, 1, 2] 
byte[] testArray4 = [3, 4] 
println testArray3 + testArray4 

выход

[A, B, C, D, E]                                       
[0, 1, 2, 3 ,4] 


Caught: groovy.lang.MissingMethodException: No signature of method: [B.plus() is applicable for argument types: ([B) values: [[3, 4]]          
Possible solutions: use([Ljava.lang.Object;), is(java.lang.Object), split(groovy.lang.Closure), wait(), any(), size()              
groovy.lang.MissingMethodException: No signature of method: [B.plus() is applicable for argument types: ([B) values: [[3, 4]]            
Possible solutions: use([Ljava.lang.Object;), is(java.lang.Object), split(groovy.lang.Closure), wait(), any(), size()              
     at main.run(main.groovy:11) 

Таким образом, было бы просто работа с Byte [] работает? Насколько опасно было бы бросать между Byte [] и byte []?

+0

Если вы даете тип это будет Groovy массив, например, http://grails.asia/groovy-array-manipulation-examples. Это не полный ответ, но это начало. –

+0

@DaveNewton отредактировал вопрос после некоторого тестирования – OsaSoft

ответ

0

Хорошо, поэтому после некоторых испытаний и исследований Ive приходят к следующему выводу: как видно из EDIT вопроса, массивы объектов прекрасны, а примитивные - нет. Поэтому просто заменяя типы массивов на Byte [], а затем позволяя GVM отбрасывать его в байт [], где это необходимо, трюк.

Например. это работает:

public byte[] toBytes(int... ints){ 
    Byte[] rv = new Byte[0] 
     ints.each{ 
      rv += (Byte[]) ByteBuffer.allocate(4).putInt(it).array() 
     } 

     return rv 
} 

assert toBytes(1,2,3) == ([0,0,0,1,0,0,0,2,0,0,0,3] as byte[]) 
Смежные вопросы