如何将文本字符串转换为比特字符串?

时间:2019-01-29 08:32:44

标签: java encryption bit-manipulation

我一直在尝试在业余时间创建一种“一次录入”加密,以便学到一些东西。我的想法是将输入(应加密)转换为比特字符串。然后,我有一个密码(也是位字符串),并且输入已使用XOR加密。例如pw = 101001,输入= 11001,然后enc =0110。我的问题是:

binary.append((val&128)==0 ? 0 : 1);如何工作? 我想我可以将其重写为

if(val&128)==0{
   binary.append(0);
}else{
   binary.append(1);
}

但是2个数字(val&128)等于一个数字(0)怎么可能? 这是我的代码:

String s ="foo";
 byte[] bytes = s.getBytes();
 StringBuilder binary = new StringBuilder();
 for(byte[] b : bytes){
   int val = b;
   for(int i=0; i<8; i++){
       binary.append((val&128)==0 ? 0 : 1);
       val <<= 1;
   }
 }
 System.out.println(s + " to binary: " + binary)

感谢帮助:)

2 个答案:

答案 0 :(得分:0)

&运算符接收两个整数值,然后按位比较它们,从而为您提供另一个整数值,该整数值是通过将两个int值以二进制格式写入彼此之间并将每个位与AND运算进行比较而生成的。

结果还是一个二进制数,该二进制数被转换回以10为基数的整数。因此,您可以将其与整数0进行比较。

示例

15 & 7 = 7:
1111 (15) & 0111 (7) = 0111 (7)

答案 1 :(得分:0)

说明的binary.append((val&128)== 0?0:1);工作

 for(byte[] b : bytes){
   int val = b;
   for(int i=0; i<8; i++){
       binary.append((val&128)==0 ? 0 : 1);
       val <<= 1;
   }
 }

val包含字节“ b”的整数值,每个字节有8位,这就是循环运行8次的原因,每次循环检查是否最右边的数字1。如果最右边的位是1,则在字符串生成器(可变名称二进制)中附加1,否则添加0。然后将val右移1。

  1. (val&128)== 0吗? 0:1 ==>检查最右边的数字是否为1
  2. val << = 1 ==>右移操作            例如val = 17 val的二进制= 00010001                 val << = 1 ==>二进制val = 00100010,val = 34

binary.append((val&128)== 0?0:1);如果最右边的位是1,则将1附加到二进制(StringBuilder)上,否则将0附加。