如何在Scala中声明一个字节数组?

Han*_*xue 36 java arrays scala

在Scala中,我可以用这种方式声明一个字节数组

val ipaddr: Array[Byte] = Array(192.toByte, 168.toByte, 1.toByte, 9.toByte)
Run Code Online (Sandbox Code Playgroud)

这太冗长了.是否有更简单的方法来声明Byte数组,类似于Java

byte[] ipaddr = {192, 168, 1, 1};
Run Code Online (Sandbox Code Playgroud)

请注意,由于.String 中的错误导致以下错误

InetAddress.getByAddress("192.168.1.1".toByte)
Run Code Online (Sandbox Code Playgroud)

Zol*_*tán 41

我相信你能做的最短的就是

val ipaddr = Array[Byte](192.toByte, 168.toByte, 1, 9)
Run Code Online (Sandbox Code Playgroud)

转换192,并168以字节,因为他们不是一个有效字节的文字,因为它们是有符号字节的范围之外([-128,127]).

请注意,Java也是如此,以下是编译错误:

byte[] ipaddr = {192, 168, 1, 1};
Run Code Online (Sandbox Code Playgroud)

您必须将192和168转换为字节:

byte[] ipaddr = {(byte)192, (byte)168, 1, 1};
Run Code Online (Sandbox Code Playgroud)

  • 有一条甚至更短的路线,特别适用于更大的阵列:`val ipaddr = Array [Byte](192,168,1,9).map(_.toByte)` (3认同)

Chr*_*tin 40

怎么样Array(192, 168, 1, 1).map(_.toByte)


KCh*_*oux 10

为了扩展Chris Martin的答案,如果你感觉很懒,而且你不想Array(...).map(_.toByte)一遍又一遍地打字,你总是可以编写一个可变函数:

def toBytes(xs: Int*) = xs.map(_.toByte).toArray
Run Code Online (Sandbox Code Playgroud)

现在,您可以像在Java中一样简洁地声明您的字节数组:

val bytes = toBytes(192, 168, 1, 1) // Array[Byte](-64, -88, 1, 1)
Run Code Online (Sandbox Code Playgroud)

  • 如果你想对效率和中间集合迂腐:`xs.iterator.map(_.toByte).toArray` (3认同)