scala - Reading from InputStream as an Iterator[Byte] or Array[Byte] -


i representing data object iterator[byte], created inputstream instance.

the problem lies in byte signed integer -128 127, while read method in inputstream returns unsigned integer 0 255. in particular problematic since semantics -1 should denote end of input stream.

what best way alleviate incompatibility between these 2 types? there elegant way of converting between 1 another? or should use int instead of bytes, though feels less elegant?

def tobyteiterator(in: inputstream): iterator[byte] = {   iterator.continually(in.read).takewhile(-1 !=).map { elem =>     convert // need convert unsigned int byte here   } }  def toinputstream(_it: iterator[byte]): inputstream = {   new inputstream {     val (it, _) = _it.duplicate     override def read(): int = {       if (it.hasnext) it.next() // need convert byte unsigned int       else -1     }   } } 

yes, can convert byte int , vice versa easily.

first, int byte can converted tobyte:

scala> 128.tobyte res0: byte = -128  scala> 129.tobyte res1: byte = -127  scala> 255.tobyte res2: byte = -1 

so elem => convert _.tobyte.

second, signed byte can converted unsigned int handy function in java.lang.byte, called tounsignedint:

scala> java.lang.byte.tounsignedint(-1) res1: int = 255  scala> java.lang.byte.tounsignedint(-127) res2: int = 129  scala> java.lang.byte.tounsignedint(-128) res3: int = 128 

so can write java.lang.byte.tounsignedint(it.next()) in second piece of code.

however, last method available since java 8. don't know alternatives in older versions of java, actual implementation astonishingly simple:

public static int tounsignedint(byte x) {     return ((int) x) & 0xff; } 

so need write

it.next().toint & 0xff 

Comments

Popular posts from this blog

c++ - Difference between pre and post decrement in recursive function argument -

php - Nothing but 'run(); ' when browsing to my local project, how do I fix this? -

php - How can I echo out this array? -