Bool массив в байтовый массив - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть функция для преобразования байтового массива в массив bool, представляющий 0 и 1:

func byteArrayToBoolArray(ba []byte) []bool {
    var s []bool

    for _, b := range ba {
        for _, c := range strconv.FormatUint(uint64(by), 2) {
            s = append(s, c == []rune("1")[0])
        }
    }

    return s
}

Как выглядит функция, действующая с точностью до наоборот, что означает преобразование массива bool в байтовый массив?

Редактировать: Эта игровая площадка дает более подробную информацию о том, как может выглядеть мой массив байтов: https://play.golang.org/p/tEDcZv-t_0Q

ba := []byte{123, 255}

1 Ответ

0 голосов
/ 25 декабря 2018

Например, boolsToBytes, обратная (абсолютно противоположная) bytesToBools,

package main

import (
    "fmt"
)

func boolsToBytes(t []bool) []byte {
    b := make([]byte, (len(t)+7)/8)
    for i, x := range t {
        if x {
            b[i/8] |= 0x80 >> uint(i%8)
        }
    }
    return b
}

func bytesToBools(b []byte) []bool {
    t := make([]bool, 8*len(b))
    for i, x := range b {
        for j := 0; j < 8; j++ {
            if (x<<uint(j))&0x80 == 0x80 {
                t[8*i+j] = true
            }
        }
    }
    return t
}

func main() {
    b := []byte{123, 255}
    fmt.Println(b)
    t := bytesToBools(b)
    fmt.Printf("%t\n", t)
    b = boolsToBytes(t)
    fmt.Println(b)
}

Детская площадка: https://play.golang.org/p/IguJ_4cZKtA

Выход:

[123 255]
[false true true true true false true true true true true true true true true true]
[123 255]

Вопрос предоставляет функцию и запрашивает обратную (выполняет в точности противоположную) функцию.

Алгоритм функции вопроса имеет недостатки, несколько входных данных отображаются на одно и то же значение функции.Следовательно, нет уникального обратного.

package main

import (
    "fmt"
    "strconv"
)

func byteArrayToBoolArray(ba []byte) []bool {
    var s []bool
    for _, b := range ba {
        for _, c := range strconv.FormatUint(uint64(b), 2) {
            s = append(s, c == []rune("1")[0])
        }
    }
    return s
}

func main() {
    ba1 := []byte{0xF}
    fmt.Println(byteArrayToBoolArray(ba1))
    ba2 := []byte{0x3, 0x3}
    fmt.Println(byteArrayToBoolArray(ba2))
    ba3 := []byte{0x1, 0x1, 0x1, 0x1}
    fmt.Println(byteArrayToBoolArray(ba3))
}

Детская площадка: https://play.golang.org/p/L9VsTtbkQZW

Выход:

[true true true true]
[true true true true]
[true true true true]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...