Par exemple, les bits dans un octet B
sont 10000010
, comment puis-je attribuer les bits à la chaîne str
littéralement, c'est-à-direstr = "10000010"
.
Éditer
J'ai lu l'octet à partir d'un fichier binaire et stocké dans le tableau d'octets B
. J'utilise System.out.println(Integer.toBinaryString(B[i]))
. le problème est
(a) lorsque les bits commencent par (le plus à gauche) 1, la sortie n'est pas correcte car elle convertit B[i]
en une valeur int négative.
(b) si les bits commencent par 0
, la sortie ignore 0
, par exemple, suppose B[0]
a 00000001, la sortie est 1
au lieu de00000001
byte
en une chaîne en base 2?Boolean
,Byte
,Short
,Char
,Int
etLong
. stackoverflow.com/a/54950845/501113Réponses:
Utilisez
Integer#toBinaryString()
:DEMO .
la source
B
. J'utiliseSystem.out.println(Integer.toBinaryString(B[i]))
. Lorsque j'utilise ces méthodes, le problème est (a) lorsque les bits commencent par (le plus à gauche) 1, la sortie n'est pas correcte car elle se convertitB[i]
en une valeur int négative. (b) si les bits commencent par 0, la sortie ignore0
, par exemple, supposeB[0]
a00000001
, la sortie est1
au lieu de00000001
byte
en Java est un entier de complément à deux signé 8 bits. Sa valeur minimale est -128 (2 ^ 8) et sa valeur maximale est127
; b) Vous pouvez facilement résoudre ce problème en utilisant ceciString.format("%8s", Integer.toBinaryString(b)).replace(' ', '0')
pour remplir à gauche la chaîne résultante avec des zéros.&
avec0xFF
.& 0xFF
convertit essentiellement asigned byte
en ununsigned integer
. Par exemple,-129
comme vous l'avez dit, est représenté par11111111111111111111111110000001
. Dans ce cas, vous voulez fondamentalement les 8 premiers bits (les moins significatifs), donc vous ET (&
) avec0xFF
(00000000000000000000000011111111
), nettoyant efficacement les 1 à gauche dont nous ne nous soucions pas, en laissant juste de côté10000001
.J'ai utilisé ça. Idée similaire à d'autres réponses, mais je n'ai vu l'approche exacte nulle part :)
0xFF
est 255, ou11111111
(valeur maximale pour un octet non signé).0x100
est 256, ou100000000
L'
&
upcasts l'octet à un entier. À ce stade, cela peut être n'importe quoi de0
-255
(00000000
à11111111
, j'ai exclu les 24 bits de tête).+ 0x100
et.substring(1)
assurez - vous qu'il y aura des zéros non significatifs.Je l'ai chronométré par rapport à la réponse de João Silva , et c'est 10 fois plus rapide. http://ideone.com/22DDK1 Je n'ai pas inclus la réponse de Pshemo car elle ne remplit pas correctement.
la source
b
est1
, sans+ 0x100
vous obtiendrez simplement"1"
votre chaîne. En ajoutant1
, vous obtenez100000001
, et si vous prenez la sous-chaîne en ignorant le premier caractère, vous obtiendrez le bon"00000001"
. Si vous ne voulez pas que votre chaîne soit rembourrée, vous pouvez simplement utiliserInteger.toBinaryString(b & 0xff)
. Le& 0xff
corrige les problèmes de complément négatif / deuxEst-ce ce que vous recherchez?
conversion de String en octet
conversion d'octet en chaîne
Ou comme João Silva l'a dit dans son commentaire pour ajouter le début,
0
nous pouvons formater la chaîne à la longueur 8 et remplacer les espaces de début résultants par zéro, donc dans le cas d'une chaîne comme" 1010"
nous obtiendrons"00001010"
la source
Vous pouvez vérifier chaque bit sur l'octet puis ajouter 0 ou 1 à une chaîne. Voici une petite méthode d'aide que j'ai écrite pour les tests:
la source
Obtenez chaque bit d'octet et convertissez-le en chaîne. Disons que l'octet a 8 bits, et nous pouvons les obtenir un par un via un mouvement de bits. Par exemple, nous déplaçons le deuxième bit de l'octet 6 bits vers la droite, le deuxième bit au dernier bit de 8 bits, puis et (&) avec 0x0001 pour nettoyer les bits avant.
la source
Ce code montrera comment un java int peut être divisé en ses 4 octets consécutifs. Nous pouvons ensuite inspecter chaque octet en utilisant des méthodes Java par rapport à une interrogation octet / bit de bas niveau.
Il s'agit de la sortie attendue lorsque vous exécutez le code ci-dessous:
Voici le code à exécuter:
la source
la source
Désolé, je sais que c'est un peu tard ... Mais j'ai un moyen beaucoup plus simple ... Pour une chaîne binaire:
Méthode getCorrectBits:
la source
la source
Vous pouvez travailler avec BigInteger comme dans l'exemple ci-dessous, surtout si vous avez 256 bits ou plus:
Un autre exemple qui accepte des octets:
Résultat:
Vous pouvez également travailler pour convertir le binaire au format Byte
Remarque: pour le formatage de chaîne pour votre format binaire, vous pouvez utiliser l'exemple ci-dessous
la source
Une réponse simple pourrait être:
la source
Nous savons tous que Java ne fournit rien de tel que le mot-clé unsigned. De plus, une
byte
primitive selon la spécification Java représente une valeur entre−128
et127
. Par exemple, si abyte
estcast
à unint
Java, il interprétera le premierbit
comme l'sign
extension de signe et utilisera.Ensuite, comment convertir un octet supérieur
127
à sa représentation sous forme de chaîne binaire ??Rien ne vous empêche d'afficher un
byte
simplement comme 8 bits et d'interpréter ces bits comme une valeur entre0
et255
. De plus, vous devez garder à l'esprit que vous ne pouvez rien faire pour imposer votre interprétation à la méthode de quelqu'un d'autre. Si une méthode accepte abyte
, alors cette méthode accepte une valeur entre−128
et127
sauf indication contraire explicite.La meilleure façon de résoudre ce problème est donc de convertir la
byte
valeur enint
valeur en appelant laByte.toUnsignedInt()
méthode ou en la convertissant enint
primitive(int) signedByte & 0xFF
. Voici un exemple:Production
la source
Juste deviner ici, mais si vous avez un Byte, ne pouvez-vous pas simplement invoquer toString () sur l'objet pour obtenir la valeur? Ou, jetant un œil à l' API , en utilisant byteValue ()?
la source