我正在使用 Pharo Smalltalk 2.0。我需要将浮点数转换为 ByteArray。似乎没有办法做到这一点,有没有迂回的方法呢?
例如,1 asFloat asByteArray
将是完美的。
上下文:我正在尝试使用 Zinc Websocket 包通过 websocket 发送二进制数据。
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 序列化。
如果您使用的是 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.