我有一个整数列表,其中包含一些二进制值
List<Integer> binary = new ArrayList();
for (int i=0; i<8; i++)
{
bin[i] = pText[i] ^ ivKey[i]; //some binary value is calculated
binary.add(bin[i]); //the binary list gets updated here
}
for (int i=0; i<myCipher2.size(); i++)
{
System.out.print(binary.get(i)); //this prints the appended binary as shown in the output
}
打印时的列表提供以下内容:
000001010100001110011101
每8位指的是一个十六进制,所以转换后我想要的输出应该给我以下
05 43 9d
如何将列表分成8位并将这8位转换为十六进制?
答案 0 :(得分:2)
您可以创建二进制字符串并将其转换为十进制,然后转换为十六进制:
int[] arr = {0,0,0,0,0,1,0,1,0,1,0,0,0,0,1,1,1,0,0,1,1,1,0,1};
int i = 0;
while (i < arr.length) {
String res = "";
for(int j = 0; j < 8; j++) {
res += arr[i];
i++;
}
System.out.println(Integer.toHexString(Integer.parseInt(res, 2)));
}
<强>输出强>
5
43
9d
答案 1 :(得分:1)
首先,您不应该使用原始类型声明通用对象,向ArrayList
添加类型:
List<Integer> binary = new ArrayList<Integer>();
由于它与您的问题没有直接关系,您可以read why you should do this here
现在,因为您的列表包含单个二进制数字,您可以使用StringBuilder
从中构建8位二进制字符串。您还可以使用StringBuilder
来构建转换后的十六进制值。每次构建这个8位字符串时,都会将其转换为十六进制(实际上先将其转换为十进制,然后再转换为十六进制),然后将其附加到StringBuilder
,然后构建十六进制字符串。
以下是代码:
// ... your program
StringBuilder hexString = new StringBuilder();
StringBuilder eightBits = new StringBuilder();
for(int i = 0; i < binary.size(); i += 8) {
for(int j = i; j < (i + 8) && j < binary.size(); j++) { // read next 8 bits or whatever bits are remaining
eightBits.append(binary.get(j)); // build 8 bit value
}
int decimal = Integer.parseInt(eightBits.toString(), 2); // get decimal value
hexString.append(Integer.toHexString(decimal) + " "); // add hex value to the hex string and a space for readability
eightBits.setLength(0); // reset so we can append the new 8 bits
}
System.out.println(hexString.toString()); // prints "5 43 9d" for the value you gave
注意:此程序是程序的延续
答案 2 :(得分:1)
所以,这是我对它的看法......
基本上,这使用List#subList
来创建主二进制数组的子列表。每个子列表最多包含8个值......
int length = Math.min(8, bits.size());
List<Integer> byteList = bits.subList(0, length);
然后我反转这个列表,你轻松颠倒for-loop
顺序,这对我来说似乎更简单......
Collections.reverse(byteList);
然后我使用简单的for-loop
循环遍历子列表。对于1
的每个位,我只需将它的二进制等效值(Math.pow(2, index)
)添加到结果值
for (int index = 0; index < byteList.size(); index++) {
int bit = byteList.get(index);
if (bit == 1) {
int pos = (int)Math.pow(2, index);
value += pos;
}
}
然后我删除主列表中的前n个值并继续,直到没有任何内容......
然后打印......
Word = 00000101 = 5; 0x05
Word = 01000011 = 67; 0x43
Word = 10011101 = 157; 0x9d
可运行的例子......
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test100 {
public static void main(String[] args) {
List<Integer> bits = new ArrayList<Integer>(25);
bits.add(0);
bits.add(0);
bits.add(0);
bits.add(0);
bits.add(0);
bits.add(1);
bits.add(0);
bits.add(1);
bits.add(0);
bits.add(1);
bits.add(0);
bits.add(0);
bits.add(0);
bits.add(0);
bits.add(1);
bits.add(1);
bits.add(1);
bits.add(0);
bits.add(0);
bits.add(1);
bits.add(1);
bits.add(1);
bits.add(0);
bits.add(1);
System.out.println();
while (bits.size() > 0) {
int length = Math.min(8, bits.size());
List<Integer> byteList = bits.subList(0, length);
Collections.reverse(byteList);
int value = 0;
StringBuilder binary = new StringBuilder(8);
for (int index = 0; index < byteList.size(); index++) {
int bit = byteList.get(index);
if (bit == 1) {
int pos = (int)Math.pow(2, index);
value += pos;
}
binary.insert(0, bit);
}
System.out.println("Word = " + binary + " = " + value + "; 0x" + pad(2, Integer.toHexString(value)));
int size = Math.max(0, bits.size());
bits = bits.subList(length, size);
}
}
public static String pad(int length, String value) {
StringBuilder zeros = new StringBuilder(value);
while (zeros.length() < length) {
zeros.insert(0, "0");
}
return zeros.toString();
}
}