Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between []uint8 && []byte (Golang Slices)

Tags:

go

One of the functions I am running: image.Decode()

The image.Decode function takes in an io.Reader && and the io.Reader function takes in a []byte.

When I pass in a []uint8, if gives me this error:

panic: image: unknown format

How do I convert the []uint8 to []byte?

UPDATE

The error is happening at the starred area because image.Decode can't read the variable xxx.

    package main

    import (
        "github.com/nfnt/resize"
        "image"
        "image/jpeg"
        "fmt"
        "launchpad.net/goamz/aws"
        "launchpad.net/goamz/s3"
        "bytes"
        "encoding/json"
        "io/ioutil"
        "os"
        "reflect"
    )

    type Data struct {
        Key string
    }

    func main() {

      useast := aws.USEast

      connection := s3.New(auth, useast)
      mybucket := connection.Bucket("bucketName")

      image_data, err := mybucket.Get("1637563605030")

      if err != nil {
        panic(err.Error())
      } else {
        fmt.Println("success")
      }

      xxx := []byte(image_data)

      ******* THIS IS WHERE THE ERROR OCCURS **************

      original_image, _, err := image.Decode(bytes.NewReader(xxx))

      ******* THIS IS WHERE THE ERROR OCCURS END **************

      if err != nil {
        fmt.Println("Shit")
        panic(err.Error())
      } else {
        fmt.Println("Another success")
      }

      new_image := resize.Resize(160, 0, original_image, resize.Lanczos3)

      if new_image != nil {
        fmt.Println("YAY")
      }
    }
like image 586
Jorge Olivero Avatar asked Apr 08 '14 23:04

Jorge Olivero


People also ask

What is [] uint8?

A UINT8 is an 8-bit unsigned integer (range: 0 through 255 decimal). Because a UINT8 is unsigned, its first bit (Most Significant Bit (MSB)) is not reserved for signing.

What is the difference between Uint and uint8?

Int8 is an Integer type which can store positive and negative values. UInt8 is an unsigned integer which can store only positive values.

What is the difference between int8 and uint8?

Differences between signed and unsigned types are- int8 can take values from -127 to 128, and uint8 - from 0 to 255. * means a number, that indicates the size of this numeric type from 8 to 256.

What is smaller than uint8?

As the name suggests, uint_least8_t is the smallest type that has at least 8 bits, uint_fast8_t is the fastest type that has at least 8 bits. uint8_t has exactly 8 bits, but it is not guaranteed to exist on all platforms, although this is extremely uncommon.


2 Answers

The Go Programming Language Specification

Numeric types

uint8       the set of all unsigned  8-bit integers (0 to 255)

byte        alias for uint8

package main

import "fmt"

func ByteSlice(b []byte) []byte { return b }

func main() {
    b := []byte{0, 1}
    u8 := []uint8{2, 3}
    fmt.Printf("%T %T\n", b, u8)
    fmt.Println(ByteSlice(b))
    fmt.Println(ByteSlice(u8))
}

Output:

[]uint8 []uint8
[0 1]
[2 3]

You have misdiagnosed your problem.

like image 65
peterSO Avatar answered Sep 18 '22 10:09

peterSO


As the other answers have explained, there's no problem passing a []uint8 where a []byte is required. If this was your problem, you'd be getting a compile time error. You aren't. A panic is a runtime error, and it's being thrown by the image library when it reads the data in the slice.

In fact, the image library is only partially your problem. See http://golang.org/src/pkg/image/format.go. It's returning an error message because it doesn't recognize the image format of the data in the slice. Your code, which calls image.Decode() is calling panic when image.Decode() returns the error message.

like image 29
Ken Bloom Avatar answered Sep 21 '22 10:09

Ken Bloom