我想将字节转换为String。
我有一个Android应用程序,我使用flatfile
进行数据存储。
假设我的flatfile
中有很多记录。
在平面文件数据库中,我的记录大小是固定的,其10
个字符,这里我存储了大量的字符串记录序列。
但是当我从平面文件中读取一条记录时,每条记录的字节数都是固定的。因为我为每条记录写了10个字节。
如果我的字符串是S="abc123";
然后它存储在像abc123 ASCII values for each character and rest would be 0
这样的平面文件中。
意味着字节数组应为[97 ,98 ,99 ,49 ,50 ,51,0,0,0,0]
。
所以,当我想从字节数组中获取实际的字符串时,那时我使用的是下面的代码,它运行正常。
但是当我给我inputString = "1234567890"
时,它会产生问题。
public class MainActivity extends Activity {
public static short messageNumb = 0;
public static short appID = 16;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// record with size 10 and its in bytes.
byte[] recordBytes = new byte[10];
// fill record by 0's
Arrays.fill(recordBytes, (byte) 0);
// input string
String inputString = "abc123";
int length = 0;
int SECTOR_LENGTH = 10;
// convert in bytes
byte[] inputBytes = inputString.getBytes();
// set how many bytes we have to write.
length = SECTOR_LENGTH < inputBytes.length ? SECTOR_LENGTH
: inputBytes.length;
// copy bytes in record size.
System.arraycopy(inputBytes, 0, recordBytes, 0, length);
// Here i write this record in the file.
// Now time to read record from the file.
// Suppose i read one record from the file successfully.
// convert this read bytes to string which we wrote.
Log.d("TAG", "String is = " + getStringFromBytes(recordBytes));
}
public String getStringFromBytes(byte[] inputBytes) {
String s;
s = new String(inputBytes);
return s = s.substring(0, s.indexOf(0));
}
}
但是当我的字符串有完整的10个字符时,我遇到了问题。那时我的字节数组中有两个0,所以在这一行
s = s.substring(0, s.indexOf(0));
我收到以下异常:
java.lang.StringIndexOutOfBoundsException: length=10; regionStart=0; regionLength=-1
at java.lang.String.startEndAndLength(String.java:593)
at java.lang.String.substring(String.java:1474)
当字符串长度为10时,我该怎么办。
我有两个解决方案 - 我可以检查我的inputBytes.length == 10
,然后让它不要做subString条件,否则check contains 0 in byte array
。
但是我不想使用这个解决方案,因为我在我的应用程序的很多地方使用过这个东西。那么,还有其他方法来实现这个目标吗?
请建议我一些适用于各种条件的好解决方案。我认为最后第二个解决方案会很棒。 (检查在字节数组中包含0&#39;然后应用子字符串函数)。
答案 0 :(得分:1)
public String getStringFromBytes(byte[] inputBytes) {
String s;
s = new String(inputBytes);
int zeroIndex = s.indexOf(0);
return zeroIndex < 0 ? s : s.substring(0, zeroIndex);
}
答案 1 :(得分:0)
我认为此行会导致错误
s = s.substring(0, s.indexOf(0));
s.indexOf(0)
返回-1,也许你应该指定ASCII码
为零48
所以这将有效s = s.substring(0, s.indexOf(48));
检查indexOf(int)的文档
public int indexOf(int c)从:API Level 1在此字符串中搜索 对于指定字符的第一个索引。寻找 角色从头开始,然后走向末尾 字符串。
参数c要查找的字符。返回此字符串中的索引 指定字符的值,如果找不到该字符,则为-1。