繁体   English   中英

将数据存储在 java 中的字节数组中

[英]Store data in Byte array in java

我正在尝试将“密码”之类的字符串转换为十六进制值,然后将其放在一个长数组中,循环正常工作直到达到值“6F”(o char 的十六进制值)然后我有一个异常java.lang.NumberFormatException

String password = "password";
char array[] = password.toCharArray();
int index = 0;
for (char c : array) {
    String hex = (Integer.toHexString((int) c));
    data[index] = Long.parseLong(hex);
    index++;
}

我如何将 6F 值存储在 Byte 数组中,因为 6F 大于 1 个字节? 请帮助我

Long.parseLong解析十进制数。 它将字符串“10”转换为数字 10。如果输入是十六进制,则不正确- 字符串“10”应该转换为数字 16。修复方法是使用Long.parseLong(String input, int radix)方法。 你想要的基数是 16,虽然写成0x10可能更具可读性——这对编译器来说是一样的,纯粹是个人风格的选择。 因此, Long.parseLong(hex, 0x10)就是你想要的。

请注意,实际上char的数字为 go 从 0 到 65535,不适合字节。 实际上,您必须标记密码不得包含任何非 ASCII 字符(因此不能包含变音符号、雪人、表情符号、有趣的引号等)。

如果您没有检查这一点, Integer.toHexString((int) c)将变成类似16F或更差(3 到 4 个字符),它也可能变成单个字符。

更一般地说,从char c转换为十六进制字符串,然后将十六进制字符串解析为数字,完全没有意义。 它将 15 变为“F”,然后将“F”变为 15。如果您只想将 char 推入字节: data[index++] = (byte) c; 这就是你所需要的——这是你在for循环中唯一需要的行。

但是,请注意:

这真的不是你应该这样做的!

您正在做的是将字符数据转换为字节数组。 实际上并不简单——只有 256 个可能的字节,而且人们发明更多的字符。 从字面上看,有数十万。

因此,要将字符转换为字节或反之,您必须应用encoding 编码具有千差万别的属性。 然而,最常用的编码是“UTF-8”。 它代表每个unicode 符号,并具有基本 ASCII 字符看起来完全相同的有趣特性。 但是,它的缺点是任何给定的字符都会被涂抹成 1、2、3 甚至 4 个字节,具体取决于它是什么字符。 幸运的是,java 有很多工具可以做到这一点,因此,您无需关心。 真正想要的是:

byte[] data = password.getBytes(StandardCharsets.UTF8);

那是要求字符串使用 UTF8 编码将自己变成一个字节数组。 这意味着“密码”变成了序列 '112 97 115 115 119 111 114 100' 这无疑是你想要的,但你也可以有密码,比如außgescheignet ☃ ,这也有效 - 它变成了字节,您可以返回启用雪人的密码:

String in = "außgescheignet ☃";
byte[] data = in.getBytes(StandardCharsets.UTF8);
String andBackAgain = new String(data, StandardCharsets.UTF8);
assert in.equals(andBackAgain); // true

如果您将其粘贴在源文件中,请确保将其保存在用于执行此操作的任何文本编辑器中作为 UTF8,并且 javac 也以这种方式编译它(javac 有一个 -encoding 参数来强制执行此操作)。

如果您认为这会导致发送到的任何内容出现问题,并且您希望将其限制为具有相当以美国为中心的观点的人所称的“正常”字符,那么您需要与此处展示的完全相同的代码,但改用StandardCharsets.ASCII 然后,如果该行( password.getBytes(StandardCharsets.ASCII) )包含非 ASCII 字符,则会出现错误。 这是一件好事:您的基础设施无法正确处理它,我们只是在这个假设练习中假设了这一点。 在相关行的早期抛出异常正是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM