Convertir bool[] byte[]
J'ai un List<bool>
qui je veux convertir un byte[]
. Comment dois-je faire?
list.toArray()
crée un bool[]
.
Ce qui est dans la liste?
Voulez-vous 3 booléens pour devenir 1 octet ou 3 octets?
Voulez-vous 3 booléens pour devenir 1 octet ou 3 octets?
OriginalL'auteur | 2009-04-03
Vous devez vous connecter pour publier un commentaire.
Voici deux approches, selon que vous souhaitez emballer les bits des octets, ou d'avoir autant d'octets que l'original bits:
int bytes = (bools.Length + 7) / 8;
faire la deuxième incrément ligne redondante. C'est aussi plus rapide (une seule division par rapport à la division de + module)approche - je supprimer l'approche de base. c'est un gaspillage de mémoire et d'un
byte
n'est pas fait pour stockerbit
alors que je suis d'accord avec vous, c'est vraiment une question d'intention: si c'est ce qui est nécessaire, alors c'est ce qui est nécessaire
OriginalL'auteur Marc Gravell
Vous pouvez utiliser LINQ. Ce ne sera pas efficace, mais sera simple. Je suppose que vous voulez un octet par bool.
OriginalL'auteur hfcs101
La réponse de Marc est bon déjà, mais...
En supposant vous êtes le genre de personne qui est à l'aise dans les bits de se tourner, ou tout simplement envie d'écrire moins de code et squeeze sur un peu plus de performance, alors ce ici le code est fait pour vous monsieur /madame:
Il fait exactement la même chose que Marc du code, c'est juste plus succincte.
Bien sûr, si nous vraiment voulez aller tous dehors nous avons pu dérouler trop...
...et tant que nous y sommes, il permet de jeter une balle courbe sur le type de retour!
Astuce: Comme vous pouvez le voir j'ai inclus le code de retour d'un
byte[]
que les commentaires. Commentaire simplement les deux de rendement énoncés au lieu de cela, si c'est ce que vous voulez/besoin.Se Tourner Les Conseils:
Déplacement
x >> 3
est moins cher quex /8
.Masquage
x & 0x07
est moins cher quex % 8
.Masquage
x & ~0x07
est moins cher quex - x % 8
.Edit:
Voici quelques exemples de documents:
OriginalL'auteur AnorZaken
Si vous avez aucun contrôle sur le type de liste, essayez de faire une Liste, qui produisent alors le byte[] ToArray(). Si vous avez une liste de tableaux, vous pouvez utiliser:
Pour obtenir la Liste, vous pouvez en créer un avec votre indéterminée liste itérateur en entrée par le constructeur, puis produire le ToArray()? Ou copie de chaque élément, un casting pour un nouveau byte bool?
Quelques infos sur ce type de liste il pourrait aider.
OriginalL'auteur Richard Watson
Ont un look à la BitConverter classe. Selon la nature exacte de vos besoins, il peut résoudre votre problème assez facilement.
OriginalL'auteur dommer
Une autre approche de LINQ, moins efficace que @hfcs101 mais serait facile de travailler pour d'autres types de valeur:
OriginalL'auteur Joao Milasch
Ou la
IEnumerable
approche AnorZaken réponse:Et le déballage où
paddingEnd
signifie la quantité de bits à jeter depuis le dernier octet pour décompresser:OriginalL'auteur Bruno Zell