2016-01-14 2 views
0

В названии говорится все, что является самым простым способом перевернуть континент байта в Scala?Самый простой способ перевернуть континент байта в Scala

Edit: Вот пример шестнадцатеричной строки, которая может быть превращена в List[Byte] за то, что я говорю о

"44[5e405f7b46d912b50ea59d0f0962ed9e251042a4b31208315c406a4aa962]ff" was not equal to "44[e504f5b7649d215be05ad9f09026dee95201244a3b218013c504a6a49a26]ff" 
+1

Порядок байты обычно относится к порядку байт в последовательности многобайтной, т.е. сделать байты для 32-разрядного целого числа появляются как [0,0,0 , 1] или [1,0,0,0] для целочисленного значения 1. Вы имеете в виду, например, переброс байта от 0x01 до 0x80 (от 0000001 до 10000000)? – DPM

+0

Я редактировал OP. Теперь это шестнадцатеричная строка, но я добавлю список байтов. –

+0

. Вы бы манипулировали контентом в Scala так же, как и вы [на Java] (http://stackoverflow.com/questions/3842828/converting-little-endian -в-обратный порядок байт). – Castaglia

ответ

1

Если вы имеете в виде листать низко с высокими половинами битами Byte:

(b: Byte) => (b >>> 4) + (b << 4) 

Если вы хотите, чтобы перевернуть каждую половину байт на hex string я бы grouped по 2 символов затем flip пары перед созданием string снова:

val input = "44[5e405f...".replaceAll("[^0-9a-f]","") 
val expected = "44[e504f5...".replaceAll("[^0-9a-f]","") 

// as suggested by @PaulDraper in the comments 
input.grouped(2).map(_.reverse).mkString == expected 

// or the verbose  
val ab = "(.)(.)".r 
input.grouped(2).map { case ab(a, b) => b ++ a }.mkString == expected 

Если вход является List[Byte]:

val inputBytes = input.grouped(2).map(Integer.parseInt(_, 16).toByte) 
val expectedBytes = expected.grouped(2).map(Integer.parseInt(_, 16).toByte) 

inputBytes.map((b: Byte) => (b >>> 4) + (b << 4)).map(_.toByte).toSeq == expectedBytes.toSeq 
+1

Могу я предложить 'input.grouped (2) .map (_. Reverse) .mkString == expected'? –

+0

Я знал, что есть что-то, чтобы свернуть 2 персонажа! ура –

Смежные вопросы