将 Pharo Smalltalk 中的浮点数转换为字节数组?

Convert a float in Pharo Smalltalk to a bytearray?

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

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

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


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

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

也可以修改:

1
2
3
4
5
| f |

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

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

不过,Pharo 2.0 通常会预装 Fuel,
它已经包含序列化浮点数的方法:

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

如果您有 Pharo 或
两端发出吱吱声。


如果你在 i386 CPU 上,你可以使用原生 boost

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

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

否则,你有那些平台无关的访问权限:

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

注意第一种情况下从 0 开始的索引和第二种情况下从 1 开始的区别。