【发布时间】:2013-03-09 18:31:19
【问题描述】:
我需要将 ByteString 转换为 Float32(正好是 32 位大端 IEEE 754 浮点数)。 ByteString 是开放声音控制流的一部分,通过 UDP 客户端接收。
我花了很多时间进行研究,所以我希望有能使用 Smalltalk 的人能给我一个解决方案。
谢谢,提前。
【问题讨论】:
标签: smalltalk visualworks
我需要将 ByteString 转换为 Float32(正好是 32 位大端 IEEE 754 浮点数)。 ByteString 是开放声音控制流的一部分,通过 UDP 客户端接收。
我花了很多时间进行研究,所以我希望有能使用 Smalltalk 的人能给我一个解决方案。
谢谢,提前。
【问题讨论】:
标签: smalltalk visualworks
由于您似乎接收的是二进制数据,而不是格式化 ASCII 中的十进制数字,因此我不建议将其称为 ByteString,而是 ByteArray,字符串是包含字符而不是位的抽象。
在 VisualWorks 的情况下,有一个名为 UninterpretedBytes 的类专门用于存储原始数据(位或更确切地说是字节)以供以后解释。
此类包含解释字节所需的所有消息,例如 #floatAt:bigEndian:
| yourBinaryStream buffer |
yourBinaryStream := ... insert some code to create your stream here...
buffer:= UninterpretedBytes from: (yourBinaryStream next: 4).
nextFloat := buffer floatAt: 1 bigEndian: true
【讨论】:
在 Pharo Smalltalk 中,您可以:
(Float readFrom: '4.2') asIEEE32BitWord
readFrom: 只是从字符串中读取一个浮点数,然后将其转换为 IEEE 754...
【讨论】:
在 VisualWorks 中,您需要使用超类方法readFrom:在类Number 中实现。
首先在字符串上创建一个readstream,例如:
Number readFrom: '192843.887' readStream
【讨论】:
parseFloat | oldValue byte1 byte2 byte3 byte4 newValue | oldValue := byteStream next: 4. newValue := Float basicNew: 4. byte1 := oldValue basicAt: 1. byte2 := oldValue basicAt: 2. byte3 := oldValue basicAt: 3. byte4 := oldValue basicAt: 4. newValue basicAt: 1 put: byte1. newValue basicAt: 2 put: byte2. newValue basicAt: 3 put: byte3. newValue basicAt: 4 put: byte4. ^newValue 希望这段代码对其他人有所帮助。