【问题标题】:change ascii to string after adding number to it在向其添加数字后将ascii更改为字符串
【发布时间】:2018-04-19 15:03:08
【问题描述】:

我正在尝试用 ascii 字符重新构造一个字符串。我注意到,当我分解 ascii 时,它与 ascii char 的数字匹配,当我尝试对其执行 (c+=c+0) 时,这会发生变化,如下所示,我尝试恢复为原始字符串,但它没有似乎工作。我想知道当您将其附加到字符串时,ascii 编号会发生变化吗?

StringBuilder b = new StringBuilder();
char c = "e".charAt(0);
System.out.println(c);   //'e'
System.out.println(c+0); //101 -ascii
b.append(c+=c+0);
char d = b.charAt(0);
System.out.println(d-=d+0);   //blank

【问题讨论】:

  • d-=d-0??也许你的意思是d+0
  • 你想完成什么?你的代码有很多奇怪的事情发生,比如b.append(c += c+0)...如果你告诉我们你在每一行上要做什么,会发生什么,以及你期望发生什么,将会很有帮助。
  • 好吧只是 (c = c+c+0) 是的,您可以将其写为 c*=2 但目前我已将该方法切成小块进行调试,因此 c*=2 不会为完整的表格工作。我正在尝试将 String b 恢复为原始形式。 'e'

标签: java string char int


【解决方案1】:
  • 当您使用+charint 相加时,结果将被提升 到int
  • 当你使用compound assignment operators+=时,结果会被转换成left 操作数数据类型(在本例中为char

这就是您的代码所发生的情况:

StringBuilder b = new StringBuilder();
char c = "e".charAt(0);
System.out.println(c);   //'e'
System.out.println(c+0); //101 -ascii
b.append(c+=c+0); // result of c+c+0 is int 202, it is converted to char Ê
char d = b.charAt(0); // char d = Ê
System.out.println(d-=d+0); // result of d-(d+0) is int 0, it will be converted to null

【讨论】:

  • 其实你是对的,我把它变成了零。 System.out.println(String.valueOf(Character.toChars(d/2)));作品
  • @logger 您的回答是否正确?此外,System.out.println((char) (d/2)); 更简单。您需要做的就是将int 表达式d/2 转换为char
  • @pkpnd 你是否反对这个答案?没用吗?
  • @user6690200 您的回答没有向 OP 显示最佳代码实践是什么。将char 转换为int 应该通过强制转换来完成;打印出d-=d+0 只是自找麻烦。
  • @pkpnd 确实如此。如果 OP 不知道他的代码发生了什么,他怎么知道如何解决它?我没有提供解决方案,但这并不意味着它没有用。
【解决方案2】:

不清楚您要完成什么,但希望这个示例可以帮助您弄清楚发生了什么:

public static void main(String[] args) {
    StringBuilder b = new StringBuilder();
    char c = "e".charAt(0);
    System.out.println(c);   // e
    System.out.println((int) c); // 101
    char doubleC = (char) (c + c);
    b.append(doubleC);
    char d = b.charAt(0);
    System.out.println((int) d); // 202
    System.out.println(d - c); // 101
    System.out.println((char) (d - c)); // e
}

字符打印为字母还是其 ASCII 值取决于其类型。您可以看到(int) c 将字符转换为其int ASCII 值。您的c+0 方法也可以做到这一点,但方式不太直观。

您显然还想“撤消”对c 的修改,但减去d-d 总是会得到0。您需要存储c 的值并从d 中减去它。

【讨论】:

  • 假设您无权访问 var c,只能使用字符串 b。
  • 嗯..你想做什么?如果我不知道您的问题是什么,我无法帮助您解决问题。
  • 你可以做System.out.println(d / 2);
  • 所以我有一个字符串,编码序列是这样的....它将字符串分解为字符,然后用双精度数加密,然后添加一个整数序列号。然后它重新打包成一个字符串。现在我正在尝试恢复那个原始字符串。
  • 那么你需要反转“加密”方案。假设您的加密将每个字符 c 更改为 2*c + n。要解密,您需要以相反的顺序反转这些操作:(d - n) / 2,其中d 是您的加密字符。
【解决方案3】:

+0 不执行任何操作,因为字符位于数字下方(所以它本质上就像说 101 + 0)。

d-=d+0 计算结果为 d = d - d + 0,所以(因为我们正在处理字符)d - d = 0

如果您想从 d 中获取 c,则必须使用 d = d - c,因为 'c' 是初始值和最终值之间的差异。

所以不,字符的 ASCII 数字没有改变,你只是没有按照你应该做的反向计算。

就像说:x + y = z, 然后想知道为什么z - z != y

你应该这样做:z - x = y

@编辑 要在 pkpnd 的答案下添加您的评论 - 如果您只有 String b 可以使用,您仍然需要知道差异(即您增加/减少了多少)才能反转到原始字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2022-10-05
    • 2020-12-05
    • 2015-02-18
    • 2013-01-07
    • 2016-03-02
    • 2021-06-21
    相关资源
    最近更新 更多