将Pharo Smalltalk中的浮点数转换为bytearray?

时间:2013-06-14 17:23:17

标签: smalltalk pharo

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

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

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

2 个答案:

答案 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的索引的差异。