我有一个文件,其中包含注释(看起来像Java单行注释,以双斜杠//
开头)和以空格分隔的十六进制值。
文件如下:
//create applet instance
0x80 0xB8 0x00 0x00 0x0c 0x0a 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0xc 0x01 0x01 0x00 0x7F;
如何将十六进制值从字符串转换为字节数组的行?
我使用以下方法:
List<byte[]> commands = new ArrayList<>();
Scanner fileReader = new Scanner(new FileReader(file));
while (fileReader.hasNextLine()) {
String line = fileReader.nextLine();
if (line.startsWith("0x")) {
commands.add(line.getBytes());
}
}
但是可以肯定的是,这显示了符号的字节表示形式,因为它们是字符,并且不会将其转换为字节。那就对了。但是如何正确转换呢?
谢谢。
答案 0 :(得分:2)
您在正确的轨道上。只需删除结尾的;
,然后使用Integer
类中为您提供的方法即可。
while ( fileReader.hasNextLine() ) {
String line = fileReader.nextLine();
if ( line.startsWith( "0x" ) ) {
line = line.replace( ";", "" );
List<Byte> wrapped = Arrays
.asList( line.split( " " ) )
.stream()
// convert all the string representations to their Int value
.map( Integer::decode )
// convert all the Integer values to their byte value
.map( Integer::byteValue )
.collect( Collectors.toList() );
// if you're OK with changing commands to a List<Byte[]>, you can skip this step
byte[] toAdd = new byte[wrapped.size()];
for ( int i = 0; i < toAdd.length; i++ ) {
toAdd[i] = wrapped.get( i );
}
commands.add( toAdd );
}
}
答案 1 :(得分:1)
我只是想指出一点,如果您稍微放松一下规范,实际上可以使用splitAsStream
在一行中完成此操作。
List<Integer> out = Pattern.compile( "[\\s;]+" ).splitAsStream( line )
.map( Integer::decode ).collect( Collectors.toList() );
我在此处和Integer::decode
中使用Integer,因为Byte::decode
会在OP的第一个输入0x80
上引发错误。而且,如果确实需要原始数组,则需要做更多的工作,但实际操作中通常使用带框数字。
这是整个代码:
public class ScannerStream {
static String testVector = "//create applet instance\n" +
"0x80 0xB8 0x00 0x00 0x0c 0x0a 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0xc 0x01 0x01 0x00 0x7F;";
public static void main( String[] args ) {
List<List<Integer>> commands = new ArrayList<>();
Scanner fileReader = new Scanner( new StringReader( testVector ) );
while( fileReader.hasNextLine() ) {
String line = fileReader.nextLine();
if( line.startsWith( "0x" ) ) {
List<Integer> out = Pattern.compile( "[\\s;]+" ).splitAsStream( line )
.map( Integer::decode ).collect( Collectors.toList() );
System.out.println( out );
commands.add( out );
}
}
System.out.println( commands );
}
}