以下Python语句的等效Scala是什么?

时间:2012-05-07 19:47:47

标签: python scala

以下Python语句的等效Scala是什么?看起来它使用的是unsigned long或者某些东西(Scala没有)。

size = pack('!L', len(someString))

3 个答案:

答案 0 :(得分:1)

根据python文档,pack方法执行以下操作:

Return a string containing the values v1, v2, ... packed according to the given format. The arguments must match the values required by the format exactly.

!表示Big Endian,L表示Unsigned Long

你是对的,Scala没有无符号的数字。但这并不重要,因为它只意味着传入的值必须在无符号长整数范围内。

请参阅此输出:

>>> pack("!L", 2442442424)
'\x91\x94\xb6\xb8'
>>> pack("!l", 2442442424)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: 'l' format requires -2147483648 <= number <= 2147483647

我认为scala或java的stdlib中没有等效的方法,但写一个并不难。您只需将数字转换为大端,然后将其转换为字节数组。

答案 1 :(得分:1)

Scala在其标准库中没有这样的东西:你应该看看Java。

顺便说一句,您无法使用String执行此操作:您需要将此类方法应用于Array[Byte]String的问题在于它由UTF-16字符组成,因此某些字节序列是非法字符串。

答案 2 :(得分:1)

此语句没有精确的一对一映射,但您可以接近。

在Scala中,您通常不会像pack那样将二进制数据存储在字符串中。而是将其存储在Array[Byte]

Scala本身没有任何库,但是Java可以,你可以在Scala代码中使用它们。

val out = new java.io.ByteArrayOutputStream()
val writer = new java.io.DataOutputStream(out)
writer.writeInt(someString.length)
writer.close()
val data = out.toByteArray

有几点需要注意,为什么会这样:

  • DataOutputStream以big-endian顺序写入,它与您在Python代码中使用!相匹配。如果您是以小端顺序编写的,则必须使用a little-endian implementation of DataOutputStream
  • Python的pack方法写入长达4个字节,与writeInt中的DataOutputStream匹配。 writeLonglong long中的qQpack)相同。