Re: [go-nuts] Having difficulty converting []byte to float
After talking with a coworker it seems that "grep" returns a \n after its output. That was the bugger keeping my initial efforts from working. Grep was meant for "human consumption". I will need to look into buffio and scanner as Tamas suggested. On Friday, May 18, 2018 at 11:06:46 AM UTC-4, John Fox wrote: > > Drilling down farther for the heck of it > > os/exec/exec.go > func (c *Cmd) Output() ([]byte, error) { if c.Stdout != nil { > > return nil, errors.New("exec: Stdout already set") > > } > > var stdout bytes.Buffer > > c.Stdout = &stdout > > captureErr := c.Stderr == nil > > if captureErr { > > c.Stderr = &prefixSuffixSaver{N: 32 << 10} > > } > > err := c.Run() > > if err != nil && captureErr { > > if ee, ok := err.(*ExitError); ok { > > ee.Stderr = c.Stderr.(*prefixSuffixSaver).Bytes() > > } > > } > > return stdout.Bytes(), err > > } > > > stdout.Bytes() = bytes.Buffer.Bytes() > bytes/buffer.go > > // Bytes returns a slice of length b.Len() holding the unread portion of the > buffer.// The slice is valid for use only until the next buffer modification > (that is,// only until the next call to a method like Read, Write, Reset, or > Truncate).// The slice aliases the buffer content at least until the next > buffer modification,// so immediate changes to the slice will affect the > result of future reads. > func (b *Buffer) Bytes() []byte { return b.buf[b.off:] } > > // A Buffer is a variable-sized buffer of bytes with Read and Write > methods.// The zero value for Buffer is an empty buffer ready to use. > type Buffer struct { > buf []byte // contents are the bytes buf[off : len(buf)] > off int // read at &buf[off], write at &buf[len(buf)] > bootstrap [64]byte // memory to hold first slice; helps small buffers > avoid allocation. > lastRead readOp // last read operation, so that Unread* can work > correctly. > // FIXME: it would be advisable to align Buffer to cachelines to avoid > false > // sharing. > } > > I am still not sure where the "10" or '\n' came from, but I know enough to > get the program working. I am really enjoying getting to learn this language > and excited for all that I can get it to do, even if it comes with the > expected frustrations and head against wall banging. > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [go-nuts] Having difficulty converting []byte to float
After talking with a coworker it seems that "grep" returns a \n after its output. That was the bugger keeping my initial efforts from working. On Friday, May 18, 2018 at 11:06:46 AM UTC-4, John Fox wrote: > > Drilling down farther for the heck of it > > os/exec/exec.go > func (c *Cmd) Output() ([]byte, error) { if c.Stdout != nil { > > return nil, errors.New("exec: Stdout already set") > > } > > var stdout bytes.Buffer > > c.Stdout = &stdout > > captureErr := c.Stderr == nil > > if captureErr { > > c.Stderr = &prefixSuffixSaver{N: 32 << 10} > > } > > err := c.Run() > > if err != nil && captureErr { > > if ee, ok := err.(*ExitError); ok { > > ee.Stderr = c.Stderr.(*prefixSuffixSaver).Bytes() > > } > > } > > return stdout.Bytes(), err > > } > > > stdout.Bytes() = bytes.Buffer.Bytes() > bytes/buffer.go > > // Bytes returns a slice of length b.Len() holding the unread portion of the > buffer.// The slice is valid for use only until the next buffer modification > (that is,// only until the next call to a method like Read, Write, Reset, or > Truncate).// The slice aliases the buffer content at least until the next > buffer modification,// so immediate changes to the slice will affect the > result of future reads. > func (b *Buffer) Bytes() []byte { return b.buf[b.off:] } > > // A Buffer is a variable-sized buffer of bytes with Read and Write > methods.// The zero value for Buffer is an empty buffer ready to use. > type Buffer struct { > buf []byte // contents are the bytes buf[off : len(buf)] > off int // read at &buf[off], write at &buf[len(buf)] > bootstrap [64]byte // memory to hold first slice; helps small buffers > avoid allocation. > lastRead readOp // last read operation, so that Unread* can work > correctly. > // FIXME: it would be advisable to align Buffer to cachelines to avoid > false > // sharing. > } > > I am still not sure where the "10" or '\n' came from, but I know enough to > get the program working. I am really enjoying getting to learn this language > and excited for all that I can get it to do, even if it comes with the > expected frustrations and head against wall banging. > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [go-nuts] Having difficulty converting []byte to float
Drilling down farther for the heck of it os/exec/exec.go func (c *Cmd) Output() ([]byte, error) { if c.Stdout != nil { return nil, errors.New("exec: Stdout already set") } var stdout bytes.Buffer c.Stdout = &stdout captureErr := c.Stderr == nil if captureErr { c.Stderr = &prefixSuffixSaver{N: 32 << 10} } err := c.Run() if err != nil && captureErr { if ee, ok := err.(*ExitError); ok { ee.Stderr = c.Stderr.(*prefixSuffixSaver).Bytes() } } return stdout.Bytes(), err } stdout.Bytes() = bytes.Buffer.Bytes() bytes/buffer.go // Bytes returns a slice of length b.Len() holding the unread portion of the buffer.// The slice is valid for use only until the next buffer modification (that is,// only until the next call to a method like Read, Write, Reset, or Truncate).// The slice aliases the buffer content at least until the next buffer modification,// so immediate changes to the slice will affect the result of future reads. func (b *Buffer) Bytes() []byte { return b.buf[b.off:] } // A Buffer is a variable-sized buffer of bytes with Read and Write methods.// The zero value for Buffer is an empty buffer ready to use. type Buffer struct { buf []byte // contents are the bytes buf[off : len(buf)] off int // read at &buf[off], write at &buf[len(buf)] bootstrap [64]byte // memory to hold first slice; helps small buffers avoid allocation. lastRead readOp // last read operation, so that Unread* can work correctly. // FIXME: it would be advisable to align Buffer to cachelines to avoid false // sharing. } I am still not sure where the "10" or '\n' came from, but I know enough to get the program working. I am really enjoying getting to learn this language and excited for all that I can get it to do, even if it comes with the expected frustrations and head against wall banging. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [go-nuts] Having difficulty converting []byte to float
Thank you both for the quick responses. I looked in to https://github.com/lovoo/ipmi_exporter yesterday and saw the TrimSpace used as well, but I am still not sure what is adding the '\n' to the commands's Output(). Tamas, I will have to look into thebuff IO, even if I am not using this for production use (home lab), I'd still like to know what you mean behind it (though I think I have a basic understanding). Jesse, what you state matches up with what I was reading in the packages. Thank you for helping to clarify and explain it. I should have recalled how Todd McLeod kept referring to the ASCII wiki/table to see what the bytes referenced. Thank you two again! I should be able to get it working today and I will update my github with the working, custom Prometheus metric exporter for FreeNAS. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [go-nuts] Having difficulty converting []byte to float
On Fri, May 18, 2018 at 12:26 PM, wrote: > Hello all. I am creating a custom exporter for FreeNAS > https://github.com/Maelos/freenas_exporter and am stuck on the conversion of > the string of bytes provided by the commands output to a float. Here is my > code, what I have tried, and my results: > > What I have tried and results (commented so you can try and see each > https://play.golang.org/p/sevfk7Nt2w4 > Attempt 1 = binary.LittleEndian.Uint64([]bytes) to math.Float64frombits You've got a 2 byte slice, but you need 8 bytes. You're getting an 'index out of range' because you need a slice of 8 bytes. > Attempt 3 = Bytes to bytes.Reader to binary.Read(slice of bytes, > binary.LittleEndian, floatVariableToFill) to error check You've got 2 bytes in your bytes.Reader and you're trying to read 8 bytes from it, this is why you get an error. A float64 is 8 bytes so you need at least 8 bytes in your bytes.Reader. > Attempt 2 = bytes to string, String to float (strconv) You are parsing the string "2\n" which isn't a string representation of a float. So that's not going to work. The fact that these bytes are ascii characters means that your other attempts don't make a lot of sense. The ascii value for the character '2' is 50 so even if your other attempts worked you'd get a float with 50 instead of the 2 you're expecting. If you do f, err := strconv.ParseFloat(strings.TrimSpace(string(text)), 64) you'll trim off the invalid '\n' and you'll just have a '2' that will parse correctly. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
[go-nuts] Having difficulty converting []byte to float
The input is string, so use strconv.ParseFloat, or ParseInt (will there be non-integer number of cpus?) Just trim the LF with strings.TrimSpace. For production use, leave out the grep and bash, read the output lines directly with bufio.Scanner. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
[go-nuts] Having difficulty converting []byte to float
Hello all. I am creating a custom exporter for FreeNAS https://github.com/Maelos/freenas_exporter and am stuck on the conversion of the string of bytes provided by the commands output to a float. Here is my code, what I have tried, and my results: What I have tried and results (commented so you can try and see each https://play.golang.org/p/sevfk7Nt2w4 Attempt 1 = binary.LittleEndian.Uint64([]bytes) to math.Float64frombits Attempt 2 = bytes to string, String to float (strconv) Attempt 3 = Bytes to bytes.Reader to binary.Read(slice of bytes, binary.LittleEndian, floatVariableToFill) to error check Please let me know what more I can provide. I will keep hacking away at it tomorrow, but hoping I can get this done soon. Full go play write up below: package main import ( //You may need to edit these in or out depending upon the attempt "bytes" "encoding/binary" "fmt" //"strconv" //"math" ) func main() { // I have been able to test this part and I do get a return of "[50 10]" which is correct (converts string "2" for 2 CPUs). The exact statement may be a bit different. // I am running the script on the latest FreeNAS whic his built from 11.1STABLE FreeBSD. I have Go installed and am building the files on the shell //numCPUCmd := exec.Command("bash", "-c","/usr/local/bin/ipmitool -I lanplus -H ipmiAddress -U ipmiUser -f /root/ipmi_password sdr elist all | grep -c -i \"cpu.*temp\"") //numCPUBytes, _ := numCPUCmd.Output() //returns a slice of bytes and an error // ATTEMPT 1 var flty float64 sob := []byte{50, 10} fmt.Printf("\n%T %v\n\n", sob, sob) buf := bytes.NewReader(sob) err := binary.Read(buf, binary.LittleEndian, &flty) if err != nil { fmt.Println("binary.Read failed:", err) } fmt.Println(flty) /*Result []uint8 [50 10] binary.Read failed: unexpected EOF 0 */ //ATTEMPT 2 /* var f float64 text := []byte{50, 10} // A decimal value represented as Latin-1 text f, err := strconv.ParseFloat(string(text), 64) if err != nil { panic(err) } fmt.Println(f) */ /*Result panic: strconv.ParseFloat: parsing "2\n": invalid syntax goroutine 1 [running]: main.main() /tmp/sandbox657430918/main.go:44 +0x160 */ //ATTEMPT3 /* sob := []byte{50, 10} bits := binary.LittleEndian.Uint64(sob) fmt.Printf("\n\n%T %v\n\n", bits, bits) flty := math.Float64frombits(bits) fmt.Printf("\n\n%T %v\n\n", flty, flty) inty := int(flty) fmt.Printf("\n\n%T %v\n\n", inty, inty) */ /* Result panic: runtime error: index out of range goroutine 1 [running]: encoding/binary.binary.littleEndian.Uint64(...) /usr/local/go/src/encoding/binary/binary.go:76 main.main() /tmp/sandbox742704811/main.go:62 +0x20 */ } -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.