Convertir la rebanada del byte "[] uint8" a flotan64 en Golang -- arrays campo con go campo con uint8t camp Relacionados El problema

Convert byte slice “[]uint8” to float64 in GoLang


29
vote

problema

Español

Estoy tratando de convertir un []uint8 Byte Rebase en un float64 en Golang. No puedo encontrar una solución para este problema en línea. He visto sugerencias de convertir a una cadena primero y luego a un chart.stacked(): {true} chart.state.disabled: {"disabled":[false,true,false]} 0 , pero esto no parece funcionar, pierde su valor y termino con los ceros.

Ejemplo:

  chart.stacked(): {true} chart.state.disabled: {"disabled":[false,true,false]} 111  

y no funciona ...

Original en ingles

I'm trying to convert a []uint8 byte slice into a float64 in GoLang. I can't find a solution for this issue online. I've seen suggestions of converting to a string first and then to a float64 but this doesn't seem to work, it loses it's value and I end up with zeroes.

Example:

metric.Value, _ = strconv.ParseFloat(string(column.Value), 64) 

And it doesn't work...

        
       
       

Lista de respuestas

59
 
vote
vote
La mejor respuesta
 

por ejemplo,

  div111  

Salida:

  div2  
 

For example,

package main  import (     "encoding/binary"     "fmt"     "math" )  func Float64frombytes(bytes []byte) float64 {     bits := binary.LittleEndian.Uint64(bytes)     float := math.Float64frombits(bits)     return float }  func Float64bytes(float float64) []byte {     bits := math.Float64bits(float)     bytes := make([]byte, 8)     binary.LittleEndian.PutUint64(bytes, bits)     return bytes }  func main() {     bytes := Float64bytes(math.Pi)     fmt.Println(bytes)     float := Float64frombytes(bytes)     fmt.Println(float) } 

Output:

[24 45 68 84 251 33 9 64] 3.141592653589793 
 
 
     
     
6
 
vote

Creo que este ejemplo de Go Documentation es lo que está buscando: http://golang.org/pkg/encoding/binary/#example_read

  div3  

imprime 3.141592653589793

 

I think this example from Go documentation is what you are looking for: http://golang.org/pkg/encoding/binary/#example_Read

var pi float64 b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40} buf := bytes.NewReader(b) err := binary.Read(buf, binary.LittleEndian, &pi) if err != nil {   fmt.Println("binary.Read failed:", err) } fmt.Print(pi) 

Prints 3.141592653589793

 
 
5
 
vote

Como se lee los comentarios, todo depende de qué tipo de datos tenga en su corte using Sytem.Web.SessionState; public class YourClass : IRequiresSessionState { public string MyVar; protected void Page_Load(object senser, EventArgs e) { MyVar = Session["YourSessionVarName"].ToString(); } } 14.

Si es de bytes que representan un valor de punto flotante IEEE 754 en un pedido de Little Endian, luego use la respuesta de Kluyg o Petereros (mejor rendimiento sin uso de la reflexión).

Si es una representación textual en la codificación Latin-1 / UTF-8, entonces debería poder hacer lo que acaba de hacer:

  div5  

Resultado:

1.23

Playground: http://play.golang.org/p/-7ikrdg_zm

 

As the comments read, it all depends on what kind of data you have in your []uint8 slice.

If it is bytes representing an IEEE 754 floating-point value in Little Endian order, then use Kluyg's or peterSo's (better performance without use of reflection) answer.

If it is a textual representation in Latin-1/UTF-8 encoding, then you should be able to do what you just did:

package main  import (     "fmt"     "strconv" )  func main() {     var f float64     text := []uint8("1.23") // A decimal value represented as Latin-1 text      f, err := strconv.ParseFloat(string(text), 64)     if err != nil {         panic(err)     }      fmt.Println(f) } 

Result:

1.23

Playground: http://play.golang.org/p/-7iKRDG_ZM

 
 
2
 
vote

Espero que este hack sea ayuda. El propósito de ello es convertir la corriente larga de números binarios para flotar.

Por ejemplo: 0110111100010010100000111111000011001010011000000 - & gt; -3.1415

  div6  
 

I hope this hack helps. The purpose of it is to convert the long stream of binary numbers to float.

For example: 0110111100010010100000111100000011001010001000010000100111000000 -> -3.1415

func binFloat(bin string) float64 {      var s1 []byte     var result float64      if len(bin) % 8 == 0 {              for i := 0; i < len(bin) / 8; i++ {                      //Chop the strings into a segment with a length of 8.                     //Convert the string to Integer and to byte                      num, _ := strconv.ParseInt(bin[8*i: 8*(i + 1)], 2, 64)                      //Store the byte into a slice s1                     s1 = append(s1, byte(num))              }      }      //convert the byte slice to a float64.      //The algorithm below are copied from golang binary examples.       buf := bytes.NewReader(s1)      //You can also change binary.LittleEndian to binary.BigEndian     //For the details of Endianness, please google Endianness      err := binary.Read(buf, binary.LittleEndian, &result)       if err != nil {              panic(err)             fmt.Println("Length of the binary is not in the length of 8")     }      return result } 
 
 
   
   

Relacionados problema

9  ¿Cómo lidiar con uint8_t en una extensión de Python?  ( How to deal with uint8 t on a python extension ) 
Me gustaría pasar como un argumento de una función en mi módulo C una matriz de uint8_t's. No pude encontrar un método para analizar directamente esta matri...

0  Declaración de valores de mapa de bits en Objective-C  ( Declaring bitmap values in objective c ) 
Pregunta de manipulación básica. ¿Cómo puedo declarar un valor de mapa de bits uint8_t> en objetivo-c ? e.g. Valor: "00000001" es tan simple como: ...

0  uint8_t [] Transformación de matriz en NSString tiene (nulo)  ( Uint8 t array transform to nsstring got null ) 
No tengo idea de por qué la (char *) uint8_t se transforma a NSString no funciona. IVSTRING siempre es (nulo) - (IBAction)encryptPacketBtnTouchDown:(id)sen...

2  Conversión entre uint8 y char en c  ( Conversion between uint8 and char in c ) 
Tengo una API que implementa una operación de escritura a EEPROM. Aquí está su declaración: CYBLE_API_RESULT_T CyBle_StoreAppData (uint8 * srcBuff, const u...

-1  Asignación de cadena a uint8_t en c  ( String assignment to uint8 t in c ) 
Estoy tratando de asignar cadena a uint8_t buffer en IAR, pero recibo un mensaje de advertencia. rx_buffer.rx_struct.RESP.RESPOND es struct field de ...

-1  Error: Reparto de 'uint8_t * {aka insigned char *}' a 'insigned int' pierde precisión [-fpermissive]  ( Error cast from uint8 t aka unsigned char to unsigned int loses precisi ) 
Quiero imprimir las direcciones de los elementos miembros de una variable de estructura. Cuando intento compilar este programa, me da error (ERROR: FUNCIONAR ...

3  ¿Cómo interpretar el byte como int?  ( How to interpret byte as int ) 
Tengo una matriz de byte a partir del programa CPP. arr[0..3] // a real32, arr[4] // a uint8, ¿Cómo puedo interpretar arr[4] como int ? (uint...

1  Codificación y decodificación uint8_t usando tinycbor c biblioteca  ( Encoding and decoding uint8 t using tinycbor c library ) 
Estoy implementando la aplicación basada en C ++ 11 y estoy usando tinycbor C biblioteca para codificar y decodificación de datos específicos de la aplicaci...

0  ¿Qué es esto: uint8 ((doble (meteorológico1618) ?/ maxv). * 50);  ( What is this uint8doubleweather1618 maxv 50 ) 
Este código (casi) hace lo que quiero, pero no entiendo cómo puede ser tan simple. Entonces, ¿puede alguien, por favor, explícame cómo funciona este código? ...

1  Asignar un tipo a un valor uint8_t  ( Allocate a type to a uint8 t value ) 
En mi proyecto, leí la ID única de una etiqueta RFID, el resultado está en el formulario uint8_t TagRead[4] . El resultado se compara con una serie de valo...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos