次のPythonステートメントに相当するScalaは何ですか? unsigned longや何かを使っているようです(Scalaにはありません)。次のPython文に相当するScalaは何ですか?
size = pack('!L', len(someString))
次のPythonステートメントに相当するScalaは何ですか? unsigned longや何かを使っているようです(Scalaにはありません)。次のPython文に相当するScalaは何ですか?
size = pack('!L', len(someString))
このステートメントには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を使わなければなりません。pack
メソッドは、writeInt
に一致する4バイトの長さをDataOutputStream
に書き込みます。 writeLong
はlong long
(q
またはQ
)と同じで、pack
になります。の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で同等の方法があるとは思わないが、ものを書くのは難しいことではありません。あなたはビッグエンディアンにあなたの番号を変換して、バイト配列に変換する必要があります。
ありがとう@drexin。 –
Scalaには標準ライブラリにそのようなものはありません。そのためにはJavaを見てください。
ところで、String
でこれを行うことはできません:そのような方法をArray[Byte]
に適用する必要があります。 String
の問題は、それがUTF-16文字で構成されていることです。そのため、一部のバイトシーケンスは不正な文字列です。
ありがとう@dave。大変感謝しています。 –