【问题标题】:Converting in Smalltalk VisualWorks 7.9.1在 Smalltalk VisualWorks 7.9.1 中转换
【发布时间】:2013-03-09 18:31:19
【问题描述】:

我需要将 ByteString 转换为 Float32(正好是 32 位大端 IEEE 754 浮点数)。 ByteString 是开放声音控制流的一部分,通过 UDP 客户端接收。 我花了很多时间进行研究,所以我希望有能使用 Smalltalk 的人能给我一个解决方案。

谢谢,提前。

【问题讨论】:

    标签: smalltalk visualworks


    【解决方案1】:

    由于您似乎接收的是二进制数据,而不是格式化 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
    

    【讨论】:

      【解决方案2】:

      在 Pharo Smalltalk 中,您可以:

         (Float readFrom: '4.2') asIEEE32BitWord
      

      readFrom: 只是从字符串中读取一个浮点数,然后将其转换为 IEEE 754...

      【讨论】:

      • 我在学校项目中使用visualworks,我没有与pharo相同的包,导入这些包或从pharo归档将不起作用。 Float 类在 visualworks 中没有“readFrom”方法。
      【解决方案3】:

      在 VisualWorks 中,您需要使用超类方法readFrom:在类Number 中实现。 首先在字符串上创建一个readstream,例如:

      Number readFrom: '192843.887' readStream
      

      【讨论】:

      • 感谢您的帮助,您的解决方案确实有效。但由于浮动是 OSC 消息的一部分,我设法做到了这一点: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 希望这段代码对其他人有所帮助。
      猜你喜欢
      • 2013-02-14
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多