2013-03-09 2 views
1

Je dois convertir un ByteString en un Float32 (un nombre à virgule flottante IEEE 754 Big-Endian 32 bits). Le ByteString fait partie d'un flux de contrôle du son ouvert, reçu via le client UDP. J'ai passé beaucoup de temps à faire des recherches, donc j'aimerais que quelqu'un d'autre avec Smalltalk me donne une solution.Conversion en Smalltalk VisualWorks 7.9.1

Merci d'avance.

Répondre

1

Puisque vous semblez recevoir des données binaires, et non un nombre décimal en ASCII formaté, je ne recommanderais pas l'appeler ByteString, mais plutôt ByteArray, Les chaînes sont une abstraction pour contenir des caractères, pas des bits.

Dans le cas de VisualWorks, il existe une classe appelée UninterpretedBytes spécialisée dans le stockage de données brutes (bits ou plutôt octets) pour interprétation ultérieure. Cette classe a tout le message que vous devez interpréter les octets, comme par exemple #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 
+0

Thanx, cela a résolu le problème. – SolidSnake87

0

En Smalltalk Pharo vous pouvez faire:

(Float readFrom: '4.2') asIEEE32BitWord 

readFrom: lit juste un flotteur d'une chaîne, puis vous le convertir à la norme IEEE 754 ...

+0

J'utilise Smalltalk pour un projet scolaire, je n'ai pas les mêmes paquets que Pharo, et l'importation de ces emballages ou déposer à partir de pharo ne fonctionnera pas. La classe Float n'a pas de méthode "readFrom" dans Visualworks. – SolidSnake87

0

En Smalltalk, vous devez utiliser la méthode de superclasse readFrom: telle que mise en œuvre dans la classe Number. d'abord créer un ReadStream sur la chaîne, par exemple:

Number readFrom: '192843.887' readStream 
+0

Merci pour votre aide, votre solution fonctionne en effet. Mais puisque le flotteur fait partie d'un message OSC j'ai réussi à le faire de cette façon: 'parseFloat \t | oldValue byte1 byte2 byte3 octet4 newValue | \t oldValue: = ByteStream suivant: 4. \t \t newValue: = Float basicNew: 4. \t byte1: = oldValue basicAt: 1. \t octet2: = oldValue basicAt: 2. \t Byte3: = oldValue basicAt: 3. \t octet4: = oldValue basicAt: 4. \t nouveauValeur basicAt: 1 put: octet1. \t nouvelleValeur basicAt: 2 put: octet2. \t nouvelleValeur basicAt: 3 put: octet3. \t nouvelleValeur basicAt: 4 put: octet4. \t^newValue' J'espère que ce code aidera quelqu'un d'autre. – SolidSnake87