2

次のPythonステートメントに相当するScalaは何ですか?unsigned longなどを使用しているようです(Scalaにはありません)。

size = pack('!L', len(someString))
4

3 に答える 3

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には符号なしの数値はありません。ただし、これは重要ではありません。これは、渡される値が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に同等のメソッドがあるとは思いませんが、それを書くのは難しいことではありません。数値をビッグエンディアンに変換してから、バイト配列に変換するだけです。

于 2012-05-07T20:39:33.970 に答える
1

Scalaの標準ライブラリにはそのようなものはありません。Javaを調べる必要があります。

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

于 2012-05-08T00:17:42.900 に答える
1

このステートメントの正確な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のリトルエンディアンの実装を使用する必要があります。
  • Pythonのメソッドは、に一致するpack4バイトの長さを書き込みます。 の(または)と同じになります。writeIntDataOutputStreamwriteLonglong longqQpack
于 2012-05-08T16:05:01.673 に答える