次のPythonステートメントに相当するScalaは何ですか?unsigned longなどを使用しているようです(Scalaにはありません)。
size = pack('!L', len(someString))
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には符号なしの数値はありません。ただし、これは重要ではありません。これは、渡される値がunsignedlongの範囲内でなければならないことを意味するだけだからです。
この出力を参照してください。
>>> 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に同等のメソッドがあるとは思いませんが、それを書くのは難しいことではありません。数値をビッグエンディアンに変換してから、バイト配列に変換するだけです。
Scalaの標準ライブラリにはそのようなものはありません。Javaを調べる必要があります。
ちなみに、これを行うことはできませんString
:そのようなメソッドをに適用する必要がありますArray[Byte]
。問題String
は、UTF-16文字で構成されているため、一部のバイトシーケンスが不正な文字列であるということです。
このステートメントの正確な1対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
!
Pythonコードでの使用に一致するビッグエンディアンの順序で書き込みます。リトルエンディアンの順序で記述している場合は、DataOutputStreamのリトルエンディアンの実装を使用する必要があります。pack
4バイトの長さを書き込みます。 の(または)と同じになります。writeInt
DataOutputStream
writeLong
long long
q
Q
pack