2012-05-07 13 views

答えて

1

このステートメントには1対1の正確なマッピングはありませんが、近づけることができます。

通常、スカラでは、バイナリデータを文字列に格納しません(pack)。代わりにArray[Byte]に保存してください。

Scala自体にはこれに関するライブラリはありませんが、JavaではScala自体で使用でき、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メソッドは、writeIntに一致する4バイトの長さをDataOutputStreamに書き込みます。 writeLonglong longqまたはQ)と同じで、packになります。
+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を意味します。

Scalaには符号なし数値はありません。しかし、これは重要ではありません。これは、渡される値が符号なし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

ありがとう@drexin。 –

1

Scalaには標準ライブラリにそのようなものはありません。そのためにはJavaを見てください。

ところで、Stringでこれを行うことはできません:そのような方法をArray[Byte]に適用する必要があります。 Stringの問題は、それがUTF-16文字で構成されていることです。そのため、一部のバイトシーケンスは不正な文字列です。

関連する問題