以下Python语句的等效Scala是什么?看起来它使用的是unsigned long或者某些东西(Scala没有)。
size = pack('!L', len(someString))
答案 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。pack
方法写入长达4个字节,与writeInt
中的DataOutputStream
匹配。 writeLong
与long long
中的q
(Q
或pack
)相同。