Как конвертировать 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
}