文件和字节流字符串的相互转换【亲测可用】

在和其他系统做数据交互的时候,通常需要传递一些文件过去,但是文件没法直接放到webservice的字符流里传递,需要把文件转成流,然后其他系统收到后再把流转成文件。

 

下面是具体例子了

例如,这里D盘根目录下有个test.txt文件

路径为:d:/test.txt;

内容为:

Hello World
Hello Java
...

然后执行如下代码:

package com.esoon.capital.test;

import org.apache.commons.codec.binary.Base64;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class File2String {
    public static void main(String[] args) {

        String filePath = "d:\\test.txt";
        String str = file2String(filePath);
        System.out.println("文件转字符串结果:start");
        System.out.println(str);
        System.out.println("文件转字符串结果:end");

    }

    public static String file2String(String path) {
        // TODO Auto-generated method stub
        File file = new File(path);
        FileInputStream fis = null;
        StringBuffer content = new StringBuffer();
        try {
            fis = new FileInputStream(file);
            int length = 2 * 1024 * 1024;
            byte[] byteAttr = new byte[length];
            int byteLength = -1;

            while ((byteLength = fis.read(byteAttr, 0, byteAttr.length)) != -1) {

                String encode = "";
                if (byteLength != byteAttr.length) {
                    byte[] temp = new byte[byteLength];
                    System.arraycopy(byteAttr, 0, temp, 0, byteLength);
                    //使用BASE64转译
                    Base64 base64 = new Base64();
                    encode = base64.encodeToString(temp);
                    //encode = new BASE64Encoder().encode(temp);
                    content.append(encode);
                } else {
                    Base64 base64 = new Base64();
                    encode = base64.encodeToString(byteAttr);
                    //encode = new BASE64Encoder().encode(byteAttr);
                    content.append(encode);
                }
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return content.toString();
    }
}

即可在控制台输出如下信息

文件转字符串结果:start
SGVsbG8gV29ybGQNCkhlbGxvIEphdmENCi4uLg==
文件转字符串结果:end

其中这个字符串:SGVsbG8gV29ybGQNCkhlbGxvIEphdmENCi4uLg==

就是文件转换之后的字符串,直接传递给其他系统即可。

 

有了这个字符串,假如第三方收到这个字符串,需要把字符串转成文件,

需要定义要生成的文件路径和文件名称,

假如这里拿到这个字符串:【SGVsbG8gV29ybGQNCkhlbGxvIEphdmENCi4uLg==】,和要保存的文件路径:【d:/test1.txt】,这里一定要注意,转出的文件后缀名也要和传递之前的一样,否则生成的文件格式都不正确,那肯定无法正常打开了。

 

执行如下代码:

package com.esoon.capital.test;

import org.apache.commons.codec.binary.Base64;

import java.io.*;

public class String2File {
    public static void main(String[] args) {

        String string = "SGVsbG8gV29ybGQNCkhlbGxvIEphdmENCi4uLg==";
        String filePath = "d:\\test1.txt";
        stirng2File(string, filePath);

    }

    public static void stirng2File(String base64Code, String targetPath) {
        System.out.println("20个字符" + base64Code.substring(0, 50));
        System.out.println("BASE64转译String333:" + base64Code.length());
        byte[] buffer;
        FileOutputStream out = null;
        FileOutputStream out2 = null;
        try {
            Base64 base64 = new Base64();
            //解码
            buffer = base64.decode(base64Code);
            //buffer = new BASE64Decoder().decodeBuffer(base64Code);
            System.out.println("BASE64转译byte111:" + buffer.length);
            //System.out.println("数据为"+temp);
            //System.out.println("buffer长度"+buffer.length);
            out = new FileOutputStream(targetPath);
//            out2 = new FileOutputStream("D:\\test\\1.txt");
            out.write(buffer);
//            out2.write(buffer);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (out2 != null) {
                try {
                    out2.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

    }
}

 

 

得到如下内容

### 回答1: 在Qt中,可以使用QSerialPort类来实现串口通信。如果需要解析多字节数据,可以在收到数据后对数据进行解析。 首先,需要设置串口的参数,包括波特率、数据位、校验位等等。可以使用QSerialPort类的setBaudRate()、setDataBits()、setParity()等函数进行设置。 接下来,需要连接串口的readyRead()信号,该信号在有数据到达串口时触发。可以使用connect()函数将该信号连接到对应的槽函数上。 在槽函数中,可以使用QSerialPort类的readAll()函数读取串口缓冲区中的全部数据。然后可以对收到的多字节数据进行解析,具体的解析方法取决于数据的格式。 例如,如果多字节数据是以固定长度的帧格式传输的,可以在槽函数中使用一个循环来读取每一帧数据。可以定义一个缓冲区,并使用read()函数从串口中读取指定长度的数据到缓冲区中。然后可以根据帧格式对缓冲区中的数据进行解析。 如果多字节数据是以特定的分隔符作为帧之间的分隔符传输的,可以使用QSerialPort类的readLine()函数一次读取一行数据。然后可以使用QString的split()函数将一行数据分割成多个字段,再根据需要对字段进行解析。 解析多字节数据时,可以根据具体的需求选择适当的数据类型进行解析,例如使用int、float、QString等。 最后,根据解析结果对数据进行进一步处理,可以将解析后的数据显示到界面上,或者进行其他相关操作。 总之,Qt提供了丰富的串口通信功能,可以方便地进行多字节数据的解析。根据实际情况,可以选择适当的解析方法和数据类型,实现对多字节数据的解析和处理。 ### 回答2: 在Qt中解析串口多字节数据可以通过以下步骤进行: 1. 打开串口:使用Qt的QSerialPort类来打开串口,并设置串口的参数,包括波特率、数据位、校验位、停止位等。 2. 接收数据:使用QSerialPort类的readyRead()信号来接收串口数据。当串口接收到数据时,该信号被触发,可以在槽函数中读取数据。 3. 解析数据:根据协议约定的数据格式进行解析。如果数据是多字节的,可以根据约定的规则解析其中的各个字段。可以使用QByteArray类来转换数据,使用toInt()、toFloat()等函数将字节数据转换为相应的整数、浮点数等数据类型。 4. 处理数据:根据解析得到的数据进行进一步处理。例如,可以在界面上显示数据,保存数据到文件,发送数据等等。 5. 关闭串口:在结束数据解析后,使用QSerialPort类的close()函数关闭串口。 需要注意的是,在进行串口数据解析时,要考虑数据的完整性和错误处理机制。可以使用计时器来检测是否接收到完整的数据包,并设置适当的超时时间来处理异常情况。 希望以上的回答对您有所帮助! ### 回答3: Qt串口模块提供了一种简单的方法来解析多字节数据。当接收到多字节的数据时,我们可以使用QSerialPort类的readyRead()信号来触发槽函数,然后在槽函数中进行数据解析。 在槽函数中,我们可以使用QSerialPort类的readAll()函数来读取所有可用的数据。然后,我们可以根据我们接收到的数据的格式进行解析。 例如,如果我们接收到的是一个结构体对象的字节流,我们可以使用QByteArray类的fromRawData()函数将字节流转换为QByteArray对象。然后,我们可以使用reinterpret_cast将QByteArray对象转换为结构体对象,并访问其各个字段来获取所需的数据。 如果我们接收到的是一个固定长度的数据包,我们可以使用QByteArray类的mid()函数来截取指定长度的字节数组。然后,我们可以使用QDataStream类来从字节数组中读取所需的数据。 另外,如果我们接收到的是一组以特殊字符分隔的字符串,我们可以使用QByteArray类的split()函数将字符串分割成一个字符串列表。然后,我们可以使用QString类的toInt()或toFloat()函数将字符串转换为所需的数据类型。 总之,在Qt中解析多字节数据主要是根据接收到的数据的格式进行相应的处理,使用Qt提供的类和函数来操作字节数组、字符串和各种数据类型的转换。 希望这个简单的解释可以帮助您理解如何在Qt中解析多字节数据。如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱的叹息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值