以下Python語句的等效Scala是什麼?它看起來像使用無符號long或什麼(Scala沒有)。以下Python語句的等效Scala是什麼?
size = pack('!L', len(someString))
以下Python語句的等效Scala是什麼?它看起來像使用無符號long或什麼(Scala沒有)。以下Python語句的等效Scala是什麼?
size = pack('!L', len(someString))
這條語句沒有一個確切的一對一映射,但您可以關閉。
在斯卡拉,您通常不會將二進制數據存儲在字符串中,因爲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
大端訂單,你在Python代碼中使用的!
匹配寫道。如果您以小端順序編寫,則必須使用a little-endian implementation of DataOutputStream。pack
方法寫入長度爲4個字節,其中匹配writeInt
在DataOutputStream
。 writeLong
將與在pack
中的long long
(q
或Q
)相同。按照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.
的!
裝置大端,所述L
裝置Unsigned Long
。
你是對的,斯卡拉沒有無符號數字。但是這並不重要,因爲它只意味着傳入的值必須在無符號長整型的範圍內。
看到以下輸出:
>>> 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等效的方法,但它不應該是很難寫一個。您只需將您的號碼轉換爲大端,然後將其轉換爲字節數組。
Thanks @drexin。 –
Scala在其標準庫中沒有這樣的東西:你應該看看Java的。
順便說一句,你不能這樣做String
:你需要應用這種方法Array[Byte]
。 String
的問題在於它由UTF-16字符組成,因此一些字節序列是非法字符串。
謝謝@dave。不勝感激。 –