我需要将所有新行分隔符更改为 \r\n。在字节表中有一些 \r 和一些 \r\n
byte[] data = (byte[]) transformedToByteObject;
数据包含该字节,但我不知道如何处理该更改,我只需要处理字节和字节,无法转换为字符串
首先,您需要了解换行符只是相对于特定字符编码的换行符。幸运的是,几乎每个字符编码都在底端使用相同的 ASCII 集,而 \n 和 \r 是其中的一部分。
有许多方法可以解决这个问题,不同程度的效率和复杂性。采取低效率但低复杂度的方法:
遍历transformedToByteObject
数组,如果没有字符,则将其(byte) '\r'
复制到目标数组。
如果是,'\r'
那么您也将其复制到目标数组,但请检查下一个字符是否为'\n'
. 如果不是,则将一个插入目标数组。
一些提示:您的目标数组最多是您的输入数组的 2 倍(最坏的情况,您的输入数组只是充满了'\r'
)。因此,您可以使用transformedToByteObject.length * 2
. 保留写入的实际字节数的计数器,一旦知道转换后的长度,将这些字节复制到另一个精确大小的字节数组中System.arrayCopy()
一种这样的实现可能如下所示:
final byte[] original = ...;
final byte[] transformed = new byte[original.length * 2];
int len = 0;
for (int i = 0; i < original.length; i++) // for each original byte ...
{
transformed[len] = original[i]; // copy the byte
len++; // track the number of transformed bytes written
if (original[i] == (byte) '\r') // if this is a \r ...
{
if (i + 1 < original.length && // ... and there is a character that follows ...
original[i+1] != (byte) '\n') // ... and that character is not a \n ...
{
transformed[len] = (byte) '\n'; // ... insert a \n
len++; // ... being sure to track the number of bytes written
}
}
}
final byte[] result = new byte[len]; // prepare an exact sized array
System.arrayCopy(transformed, 0, result, 0, len); // and copy the transformed bytes into it