我正在使用Pharo Smalltalk 2.0。我需要将float转换为ByteArray。似乎没有办法做到这一点,是否有一种迂回的方式呢?
例如,1 asFloat asByteArray
将是完美的。
上下文:我正在尝试使用Zinc Websocket包通过websocket发送二进制数据。
答案 0 :(得分:3)
Float
已经是一个变量类,即有点类似于数组:
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或者,你可能想要完全使用Fuel序列化 两端都发出吱吱声。
答案 1 :(得分:2)
如果您使用的是i386 CPU,则可以使用本机提升
(ByteArray new: 8) nbFloat64AtOffset: 0 put: Float pi; yourself
请注意,在这种情况下,字节顺序是littleEndian。
否则,您将拥有与平台无关的访问权限:
(ByteArray new: 8) doubleAt: 1 put: Float pi bigEndian: true ; yourself
注意第一种情况的基于0的索引和第二种情况的基于1的索引的差异。