最佳实践?将字符转换为字节

时间:2013-11-19 01:05:11

标签: java encryption casting char byte

我一直在使用one-time padXor加密程序。我对这个主题进行了一些研究并寻找了我的问题的答案,但如果我错过了任何一个,请随时在评论中告诉我。基本上我一直在将输入文本文件转换为BufferReaders,从那里我一直在为文档的每一行创建一个字符串。然后我使用n个字符的一次性填充并使用以下行:

for(int x=0;x<stringLine.length()-1;x++){
        byte z= (byte) (stringLine.charAt(x)^oTP.get(y));

y对于实际问题并不重要,但它会跟踪一次性缓冲区的整体索引,通过每次使用(使用相同的pad加密多个.txt文件)以及每一行。

我也使用类似的转换技术,但是从字节到它们的原始char表示:

for (int x=0; x<bit.size(); x++){
       for (int q=0; q<bit.get(x).size(); q++){
              outF.print((char) (bit.get(x).get(q)).byteValue());

bitArrayList<ArrayList<Byte>>,其中包含多个ArrayList<Byte>,每个索引代表一行中每个字符的加密字节。 outF只是用于编写加密文件的简单PrintWriter

这一直是我最后一个问题的背景:从bytechar,反之亦然,这是解决这个问题的最佳方法吗?如果我想要的输出是每个字节的ASCII表示,而不仅仅是数字表示,这是最佳最有效的方法来实现它吗?

该程序似乎到目前为止工作,但我不确定它是否按照我的意愿工作。

提前感谢您提供任何帮助和/或建议。

1 个答案:

答案 0 :(得分:3)

不,将char投射到byte不是一个好习惯。要将文本转换为字节字符串,您应该使用Charset或其他API,它提供了众所周知的字符到字节编码。例如:

byte[] encoded = str.getBytes(StandardCharsets.US_ASCII);

同样适用于将字节解码为文本:

String str = new String(buf, StandardCharsets.US_ASCII);

但是,根据您的应用程序的描述,您根本不应该转换为文本。使用这样的东西:

static void encrypt(InputStream is, OneTimePad otp, OutputStream os) throws IOException {
  long index = 0;
  byte[] buffer = new byte[8192];
  while (true) {
    int n = is.read(buffer);
    if (n < 0)
      break;
    for (int i = 0; i < n; ++i)
      buffer[i] ^= otp.get(index++);
    os.write(buffer, 0, n);
  }
}