将原始字节转换为字符串

问题描述 投票:0回答:1

我的 java 代码有这个问题,我有点坚持我的解决方案,所以我想将从网络嗅探器工具 (wireshark) 捕获的原始字节转换为字节的字符串实际值

基本上这是我想创建的解决方案,但我没有想法,因为我无法输入它

String array= "6549534f3030363030303036303038303038323230303030303030303030303030303430303030303030303030303030303034313830373432313730303030303130303103";
        char[] ch=array.toCharArray();
        String charTemp = "";
        byte[] byteArray= {};

        for (int i = 0; i < ch.length; i++) {
            if(i%2==0) {
                System.out.println(charTemp);
                System.out.println(byteArray.length);
                byteArray[byteArray.length]=(int) charTemp;
                charTemp="";
            }
            charTemp+=ch[i];
            System.out.print(ch[i] + " ");
        }

实际上我想要这个 link 但在我的 java 代码上,因为我想学习如何进行字节操作,也许如果有人有参考/指南如何学习字节操作,请推荐我 :) 谢谢

java byte
1个回答
0
投票

这里至少有 4 个问题,最重要的是,这不是一个特别有效的算法(并不是说这可能很重要)。

将 ASCII 值与数字合并

字符

6
实际上是值54。不,真的:

char c = '6';
int v = (int) c;
System.out.println(v); // this would print 54.

毕竟,一个角色可能是“A”。那应该变成什么“数字”?在计算机系统中,任何字符都在一个巨大的表格中查找,该表格将一个符号(例如 a、5、空格、回车、ç、é、☃,甚至 😀)与数字相匹配。

该表中的字符(或符号,如果您喜欢该术语)“6”与代码 54 相关联。

尝试将字符串转换为 int

charTemp
是一个字符串,最终将包含例如
"4f"
。那是2个数字。 Java 正确地识别出尝试将其转换为 int 是没有意义的。 (即使一个字符串只包含 1 个字符,java 也会这样做 - 编译器知道你不能通过强制转换将字符串转换为 int,它不会费心检查在这种情况下它是否可能具有某种意义。它可能没有意义,所以你不能这样做)。

你想要的是将字符串“4f”转换成它的值。 “4f”本身只是一个字符串形式的数字,就像“100”一样。除了,它是以 16 为底,而不是以 10 为底。不过,还是一个数字。

那么,我们如何将字符串中的数字转换为它们的值?当然,还有

Integer.parseInt
。其中有一个变体,您可以在其中指定基数。所以:

int v = Integer.parseInt("9", 16); // 16 = the base
System.out.println(v); // prints 9
v = Integer.parseInt("f", 16);
System.out.println(v); // prints 15. That's nice.
v = Integer.parseInt("4f", 16);
System.out.println(v); // Prints out 79. Which is what you wanted, I guess.

字节和整数

您不能将 int 分配给字节数组中的值 - 您正在转换为

int
。修复以上所有问题后,您仍然需要将其替换为
(byte)
.

你错误地认为数组可以在 java 中增长

你的字节数组是空的。 java中的数组是固定大小的,所以当你创建它的时候,它是空的,而且它不能增长,所以,它就卡在那里了。

x[x.length]
总是会导致
ArrayIndexOutOfBoundsException
(因为数组的长度是第一个不起作用的索引)。毕竟,长度为 3 的数组有 3 个索引:0、1 和 2。3 本身是无效的。因此,
byteArray[0] = ...
会崩溃。

一个解决方案是适当地预先调整字节数组的大小:

byte[] byteArray = new byte[array.length() / 2];

你必须使用

byteArray[i / 2] = Integer.parseInt(charTemp, 16);

可能不需要所有这些代码

有一些工具和库可以为您读取格式为十六进制字符串(也称为半字节字符串)的字节数组,您不必编写此代码。有关更多信息,请参见this SO answer-因为这就是您要(大概)在这里做的事情。

© www.soinside.com 2019 - 2024. All rights reserved.