2012-05-07 52 views

回答

1

這條語句沒有一個確切的一對一映射,但您可以關閉。

在斯卡拉,您通常不會將二進制數據存儲在字符串中,因爲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
  • Python的pack方法寫入長度爲4個字節,其中匹配writeIntDataOutputStreamwriteLong將與在pack中的long longqQ)相同。
+0

謝謝@dave。不勝感激。 –

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. 

!裝置大端,所述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等效的方法,但它不應該是很難寫一個。您只需將您的號碼轉換爲大端,然後將其轉換爲字節數組。

+0

Thanks @drexin。 –

1

Scala在其標準庫中沒有這樣的東西:你應該看看Java的。

順便說一句,你不能這樣做String:你需要應用這種方法Array[Byte]String的問題在於它由UTF-16字符組成,因此一些字節序列是非法字符串。

相關問題