在android中将int转换为byte []

时间:2014-10-31 09:33:53

标签: android

我正在使用write()方法来写入外部存储器的文件。此方法仅接受byte []作为输入。我尝试传递一个String,然后收到一条错误消息(“FileOutputStream类型中的方法write(int)不适用于参数String”)。如果我传递一个int,我不会得到错误,但在文件中没有写任何内容。我从调用getNumSentPackets()得到的值是一个int,我需要将它转换为byte []。我一直在看这里已经回答的其他问题,我已经尝试了ByteBuffer选项,但是我在文件中得到的结果不是我想要的,这意味着,我没有得到发送数据包的数量。请问有人帮帮我吗?

这是我的代码:

     public void createFile(String name) {

    try {
      String filename = name;
      File myFile = new File(Environment.getExternalStorageDirectory(), filename);
      if (!myFile.exists())
        myFile.createNewFile();
      String title = "FLOODING RESULTS FILE\n\n";
      String sent = "Number of sent packets\n";
      FileOutputStream fos;
      byte[] data = title.getBytes();
      byte[] intSent = sent.getBytes();
      int numSent = mSender.getNumSentPackets();
      byte[] numSentBytes = ByteBuffer.allocate(10).putInt(numSent).array();
      try{
      fos = new FileOutputStream(myFile);
      fos.write(data);
      fos.write(intSent);
      fos.write(numSentBytes);
      fos.flush();
      fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
  } catch (IOException e) {
    e.printStackTrace();
  }
}

public static int getNumSentPackets() {
  return nSentPackets;
}

预期的输出文件如下:

  

洪水结果文件

     

发送的数据包数量200

200只是一个例子,这意味着我希望看到一个数字与发送的数据包总数相对应。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

由于我是一个懒惰的开发人员,我喜欢使用我选择的语言中的现有设施,例如,对于java,PrintWriter

public void createFile(String filename) {
    try {
      File myFile = new File(Environment.getExternalStorageDirectory(), filename);

      PrintWriter out = new PrintWriter(myFile); // this will create the file if necessary

      out.println("FLOODING RESULTS FILE");
      out.println();
      out.print("Number of sent packets ");
      out.println(mSender.getNumSentPackets());
      out.close();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

这比您当前的方法更容易阅读和维护,看起来更加惯用。

答案 1 :(得分:0)

ByteBuffer.allocate(capacity).putInt(yourInt).array();

答案 2 :(得分:0)

“200”的文本表示要求您编写3个字符。所有文件最后只是一堆字节,因此需要从字符到某个字节值的映射。假设ASCII(*)要写入文件的数据为

//                    '2','0','0'
byte[] textVersion = { 50, 48, 48 } 
另一方面,

int是一个32位数值,即有4个字节,200等于

byte[] intVersion = { 0, 0, 0, 200 }

使用ByteBuffer时,你会得到这个。如果您将其写入文件,并且文本查看器试图显示如果您幸运,它将显示◻◻◻Č之类的内容。 0实际上是一个不可打印的控制字符,因此在打印时经常会被跳过,或者用像盒子这样奇怪的字符替换。 200在Windows-CP1250中等同于Č。当解释为UTF8时,它没有任何意义 - 它是2字节序列的开始,因此需要下一个2字节来确定要显示的字符。

您可以使用

String.valueOf(200).getBytes( /* you should specify which encoding to use here */ );

首先创建"200"字符串,然后返回这3个字符所需的字节。

然而,您应该使用基于Java的基于字符的IO工具:众多(和令人困惑的)Reader& Writer实施。它们全部(* ^ 2)在最后包装InputStreamOutputStream,并为您进行文本到字节转换。

PrintWriter可能是最方便使用但不是没有缺陷:https://stackoverflow.com/a/15803472/995891 应避免使用FileWriter,因为您无法指定编码

更长的替代路线是

BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(
             new FileOutputStream(file), encoding));
writer.write("Hello ");
writer.write(String.valueOf(200));
writer.newLine();

(*)大多数编码与前127个字符的ASCII兼容,基本上涵盖了普通的英文文本。

(* ^ 2)没有强制Writer将字符输出到流中,例如StringWriter。但它们主要以这种方式使用。