2017-02-02 10 views
2
import java.lang.Long as JLong 
import java.lang.Byte as JByte 
import java.nio.ByteBuffer 

fun Long.toByteArray1() = 
    ByteBuffer.allocate(JLong.SIZE/JByte.SIZE) 
     .putLong(this) 
     .array() 

fun Long.toByteArray2() = 
    this.toString() 
     .toByteArray(Charsets.UTF_8) 

fun main(args: Array<String>) { 
    val a1: ByteArray = 10L.toByteArray1() 
    val a2: ByteArray = 10L.toByteArray2() 
    println("a1 = ${a1.toString()}") 
    println("a1 = ${ByteBuffer.wrap(a1).getLong()}") 
    println("a2 = ${a2.toString()}") 
    println("a2 = ${String(a2, Charsets.UTF_8)}") 
} 

toByteArray1()とtoByteArray2()の違いは何ですか?LongからByteArrayへの2つの変換の違いは何ですか?

出力ストリームにバイトを送信すると、どの受信者に送信されますか?

+1

FYI '" a1 = $ {a1.toString()} "'は "a1 = $ a1"と同じです – voddan

答えて

2

これらは全く異なっています。

println(0.toByteArray1().size) // 8 
println(1234.toByteArray1().size) // 8 
  • .toByteArray2()最初のバイト配列に長いStringに変換し:署名された長い数の

    • .toByteArray1()戻りバイトが(したがって、正確に8バイト= 64ビットを含むべきです) UTF-8でエンコードされた文字(String)(数字のみが存在するため、それぞれ1バイトずつエンコードされます)。この場合のバイト配列には、文字列表現の長さと同じバイト数が含まれます。

      println(0.toByteArray2().size) // 1 
      println(-1234.toByteArray2().size) // 5 
      println(123456789012.toByteArray2().size) // 12 
      

    そして、あなたはa1a2をデコードどこの例のように、もちろん、デコーダは、異なっている必要があります。

  • +0

    ありがとう!たとえば、プロトコルが文字列コマンドをバイト配列に変換しただけの場合は、toByteArray2()を使用する必要がありますか?プロトコルが特殊なバイナリ形式ならば、toByteArray1()はおそらく有用でしょうか? –

    +0

    @AndreiSibircevsプロトコルで文字列コマンドを使用している場合は、数値を文字列に変換してください。 – Ilya

    関連する問題