【问题标题】:Is there a way to convert a String (character by character) to its ASCII value in Java? [duplicate]有没有办法将字符串(逐个字符)转换为 Java 中的 ASCII 值? [复制]
【发布时间】:2019-03-19 00:53:00
【问题描述】:

我目前正在尝试编写一个加密程序,并且正在尝试弄清楚用户如何输入字符串(数字、字母和特殊字符的混合)并让程序将每个字符转换为其数字ASCII 值。我在整个互联网上进行了搜索,但似乎找不到任何可以做到这一点的方法或代码行。现在,在有人说“尝试将其转换为整数”之前,我已经尝试过了,但它不起作用。因此,如果有人可以在这件事上帮助我,我将不胜感激。

【问题讨论】:

  • “它不起作用”是什么意思?
  • @Kiltos_Kyriscou 我的意思是它会导致错误,指出类型不兼容:java.lang.String 无法转换为 int。
  • 字符串不是字符,而是字符列表。您必须选择一个字符才能从字符串中拉出。
  • 从根本上说:字符串是字符的列表(从技术上讲,是已编码为 UTF-16 代码单元的 Unicode 代码点列表)。但是加密算法通常在字节级别上工作。因此,与其假设字符和字节是同一个东西(尽管 C 混淆地使用 char 来指代一个字节,但它们不是同一个东西),您需要在对其进行面向字节的操作之前将数据转换为字节。

标签: java string encryption ascii


【解决方案1】:

可以循环遍历字符串,使用字符串的charAt()方法:

String s = "abcd";

for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    int value = s.charAt(i);
    System.out.println(c + " " + value);
}

将打印:

a 97
b 98
c 99
d 100

【讨论】:

  • 谢谢你的帮助,我想我会这么做的。
【解决方案2】:

要将字符转换为数字,您需要选择一种编码。 US-ASCII 是一种方法,但请注意,US-ASCII 只定义了大约 95 个字符;任何不是这 95 个字符之一的字符都会导致转换为字节的过程引发异常。当您希望能够转换所有字符(从 ü 到 ☃ 到 emojis)时,UTF-8 是通常的首选。请注意,在 UTF-8 中,任何非 ASCII 字符最终都是一个字符的多个字节,因此 10 个字符的字符串最终可能多达 50 个字节。

String test = "Hello!";
byte[] asBytes = test.getBytes(StandardCharsets.US_ASCII);
String fancy = "Wééé! ☃";
byte[] fancyBytes = fancy.getBytes(StandardCharsets.UTF_8);

【讨论】:

  • 澄清一下,US-ASCII 定义了 128 个字符,其中 95 个是可打印的。
  • @rzwitserloot 我认为 Java 中的字符串是用 UTF-16 编码的,无法修改或编码为 UTF-8
  • @Gh0stwarr10r 不,忘记这一点:在内部,java 以 UTF-16 格式存储字符串,但 .getBytes 可以转换。它不会改变字符串的内部表示形式(它根本不会改变字符串;字符串是不可变的),它会创建一个新的字节数组。
  • @rzwitserloot 好的,谢谢你的澄清。
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 2020-01-19
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 2021-04-04
相关资源
最近更新 更多