Convert a float in Pharo Smalltalk to a bytearray?
我正在使用 Pharo Smalltalk 2.0。我需要将浮点数转换为 ByteArray。似乎没有办法做到这一点,有没有迂回的方法呢?
例如,
上下文:我正在尝试使用 Zinc Websocket 包通过 websocket 发送二进制数据。
A
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 开始的区别。