Как конвертировать IMEI в байты и обратно на golang

Пытаюсь выполнить преобразование IMEI массив байт и затем преобразовать обратно. К сожалению новичок в Go потому не совсем понимаю как правильно это сделать.

package main

import ( 
    "fmt"
)

func main() {
    var value = 861230048253042
    var bytes = make([]byte, 8)

    for i := 0; i < 8; i++ {
        bytes[i] = value & (255)
        value = value / 256
    }
    fmt.Println("byte imei", bytes) // 114 148 24 191 72 15 3 0

    var new_value = 0;

    for i := 7; i >= 0; i-- {
        new_value *= 256
        new_value += bytes[i]
    }

    fmt.Println("Real ImeI", new_value)
}

Ответы (2 шт):

Автор решения: KordDEM

Решение: отвык от строгой типизации в языках, которым видимо является golang потому правильный код выглядит так

import ( 
    "fmt"
)

func main() {
    var value uint64 = 861230048253042
    var bytes = make([]byte, 8)

    for i := 0; i < 8; i++ {
        bytes[i] = (byte) (value & 255) // нужно конкретно указывать в какой тип преобразуем справа, что бы он соответствовал левому типу
        value = value / 256
    }
    fmt.Println("byte imei", bytes)

    var new_value uint64 =0
    for k := 7; k>=0; k--{
        new_value *= 256
        new_value += uint64(bytes[k]) // аналогично указываем конкретный тип преобразования
    }

    fmt.Println("real imei", new_value )
}
→ Ссылка
Автор решения: zed

Для таких целей в go есть пакет binary, в котором есть две функции:

  • Write - позволяет записать числа (fixed-size values) в бинарное представление
  • Read - делает обратную операцию

Пример с вашим интом:

package main

import (
    "log"
    "bytes"
    "encoding/binary"
    "fmt"
)

func main() {
    var value uint64 = 861230048253042
    buf := new(bytes.Buffer)

    err := binary.Write(buf, binary.LittleEndian, value)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%v\n", buf.Bytes()) // [114 148 24 191 72 15 3 0]

    var newValue uint64
    err = binary.Read(buf, binary.LittleEndian, &newValue)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(newValue) // 861230048253042
}
→ Ссылка