【问题标题】:How is an Integer converted to ASCII in Java Behind the Scenes?Java 后台如何将整数转换为 ASCII?
【发布时间】:2020-09-06 06:30:54
【问题描述】:

我并不是要一个内置类来完成这个,我只是好奇编码在 java 中是如何在幕后工作的。例如,Java 中的整数可以存储在 4 个字节中,介于 -2147483648 和 2147483647 之间。让我们使用 500 作为此演示的数字。据我了解,计算机最初将此数字以十六进制的 1F4 形式存储在内存中,即二进制的 00000000 00000000 00000001 11110100 。当我查看 ASCII 的工作原理时,它将每个数字 0-9 编码为其对应的 ASCII 值(0 转换为 048)。但是,存储在 ram 中的二进制数如何能够将每个数字分开,以便将每个数字编码为相应的 ASCII 值?我们知道这个数字是 500,但这只是一个抽象。计算机只看到 1 和 0。那么对于这个例子,5 是如何映射到 053 的,而两个 0 是如何映射到 048 的。 jvm 会在幕后自动解决这个问题吗?还是我误解了整个过程是如何运作的。谢谢。

【问题讨论】:

  • Java 字符是 16 位整数类型。 Ascii Table 包含 127 个有效的 ascii 字符及其到整数常量的映射。通常,将该映射编码为编程语言的过程是三阶段引导过程的“阶段 1”。这不是 Java 独有的。另请参阅Reflections on Trusting Trust

标签: java encoding binary ascii


【解决方案1】:

好吧,如果我直接理解你的问题...

您可以首先将整数除以 10 并得到余数——Java 中的 mod 函数 (%) 对此很有用。

int digitInteger = originalNumber % 10;

digitInteger 变量现在包含一个数字 0-9,即数字中 最后一个位的 ASCII(或 Unicode,或其他)的整数版本。不幸的是,对于您的示例,这将是一个相当无聊的 0。

让我们改为使用数字 543 作为示例,它会使事情变得更容易。如果 originalNumber 是 543,那么 digitInteger 现在将是 3。由于 48 代表 ASCII 0,那么您可以将其添加到 digitInteger 以获得 ASCII 等价物。我会把它留给你把它放在某个地方,因为 Java 不将 ASCII 作为其默认编码处理。 (我相信,Unicode 与这些数字的 ASCII 值相同)。

现在你执行类似的东西

originalNumber = originalNumber / 10;

这个 integer 除法将截断您刚刚隔离的数字,在我们的例子中是 3,而 originalNumber 现在是 54。

你重复这个过程 - mod by 10 以隔离最后一个数字,转换为字符,添加到以前找到的字符,整数除以 10 以截断最后一个数字 - 直到 originalNumber 为 0 - digitInteger,你可能可以现在看,下一轮将是 4,之后的一轮将是 5,然后您将它们添加到您第一次获得的 3 之前以获得您的 ASCII 等价物。

【讨论】:

  • 虽然这是有用的信息,但我在问题中表示我想知道 java 是如何运行的,并在幕后执行此操作。不是我自己如何实现它。你是说java做这个过程吗?我只是很困惑在 java 中声明为 int 的数字是如何编码的,因此文本编辑器可以理解它的 ascii 表示。
  • 也许你应该看看开源版本的东西,注意这可能是在 C 中,它通常用于 Java 中的低级实现。我认为它必须与此等价;我无法想象除了某种形式之外,还有什么方法可以确定数字是什么。二进制整数形式不适合任何更容易转换为字符串形式。
  • 这不是一个函数,也不是'mod'。它是一个余数运算符。
  • 你是对的,它是一个运算符。它被称为“mod”,是“模数”或“模数”的缩写,是运算的数学术语。
猜你喜欢
  • 2014-09-03
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2016-04-29
  • 1970-01-01
相关资源
最近更新 更多