为了账号安全,请及时绑定邮箱和手机立即绑定

如何将文件中的十六进制值读入字节数组?

如何将文件中的十六进制值读入字节数组?

幕布斯6054654 2022-03-10 15:53:19
我有一个文件,其中包含注释(看起来像以双斜杠开头的 Java 单行注释//)和以空格分隔的十六进制值。文件如下所示://create applet instance0x80 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());      }}但可以肯定的是,这显示了符号的字节表示,因为它们是字符并且不会将其转换为字节。这是正确的。但是如何正确转换呢?
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

你在正确的轨道上。只需删除尾随;,然后使用课程中为您提供的方法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 );

    }

}


查看完整回答
反对 回复 2022-03-10
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

只是想我会指出,如果你稍微放松一下规范,你基本上可以在一行中做到这一点splitAsStream。


List<Integer> out = Pattern.compile( "[\\s;]+" ).splitAsStream( line )

       .map( Integer::decode ).collect( Collectors.toList() );

我在这里使用整数,Integer::decode因为会在 OP 的第一个输入Byte::decode上引发错误。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 );

   }

}


查看完整回答
反对 回复 2022-03-10
  • 2 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信