3

我正在使用 Pharo Smalltalk 2.0。我需要将浮点数转换为 ByteArray。似乎没有办法做到这一点,有没有迂回的方法呢?

例如,1 asFloat asByteArray将是完美的。

上下文:我正在尝试使用 Zinc Websocket 包通过 websocket 发送二进制数据。

4

2 回答 2

3

AFloat已经是一个变量类,即有点类似于数组:

3.14. "=> 3.14"
3.14 size. "=> 2"
3.14 at: 1. "=> 1074339512"
3.14 at: 2. "=> 1374389535"

你也可以修改它:

| f |

f := 3.14.
f at: 1 put: 10000.
f. "=> 2.1220636948306e-310"

考虑到这一点,您现在可以处理这两个整数。

然而,Pharo 2.0 通常预装了 Fuel,它已经包含了序列化浮点数的方法:

ByteArray streamContents: [ :s |
  FLEncoder on: s globalEnvironment: Dictionary new do: [ :e |
    3.14 serializeOn: e ]] "=> #[64 9 30 184 81 235 133 31]"

如果两端都有 Pharo 或 Squeak,您可能希望完全使用 Fuel 序列化。

于 2013-06-14T18:02:59.710 回答
2

如果您使用的是 i386 CPU,则可以使用本机提升来完成

(ByteArray new: 8) nbFloat64AtOffset: 0 put: Float pi; yourself

请注意,在这种情况下字节顺序是 littleEndian。

Otherwise, you have those platform independent access:

(ByteArray new: 8) doubleAt: 1 put: Float pi bigEndian: true ; yourself

Note the difference with 0-based index for first case, and 1-based for second case.

于 2013-06-14T20:52:53.770 回答