【问题标题】:Casting int to char in java- must I use ASCII?在java中将int转换为char-我必须使用ASCII吗?
【发布时间】:2011-05-13 12:22:11
【问题描述】:

问:在 Java 中将 int 转换为 char 时,默认结果似乎是与该 int 值对应的 ASCII 字符。我的问题是,有什么方法可以指定在投射时使用的不同字符集吗?

(背景信息:我正在做一个项目,在该项目中我读入一串二进制字符,将其转换为块,然后将块转换为十进制整数值,然后将其转换为字符。我然后需要能够通过反转过程将生成的压缩字符“扩展”回二进制。 我已经能够做到这一点,但目前我只能将最多 6 个“位”压缩成一个字符,因为当我允许更大的数量时,该范围内的一些值似乎没有被处理ASCII 好;它们变成盒子或问号,当它们被转换回 int 时,它们的原始值没有被保留。如果我可以使用另一个字符集,我想我可以避免这个问题并将二进制文件一次压缩 8 位,这是我的目标。)

我希望这很清楚,并在此先感谢!

【问题讨论】:

  • “一串二进制字符”,嗯?
  • 整数是 >0 和

标签: java char casting character


【解决方案1】:

您的问题与 ASCII 或字符集无关。

在 Java 中,char 只是一个 16 位整数。将 int(32 位整数)转换为 char 时,您唯一要做的就是保留 int 的 16 个最低有效位,并丢弃高 16 位。这称为缩小转换

参考资料:

【讨论】:

    【解决方案2】:

    字符和整数之间的转换使用Unicode 值,ASCII 是其中的一个子集。如果您正在处理二进制数据,则应避免使用字符和字符串,而应使用整数数组 - 请注意 Java 没有无符号 8 位整数。

    【讨论】:

    • 他提到他正在从 int 转换为 char。这与字符集无关:字符只不过是 16 位整数;强制转换只保留低 16 位并丢弃高 16 位。
    • @Grodriguez:char 是一个 16 位整数与文本相关的含义。它是 16 位的事实更像是一个历史性的巧合——它很容易成为 24 位。如果你只想要一个 16 位整数,你应该使用 short。使用char 存储任意二进制数据不是一个好方法——这不是char 的设计目的。 stackoverflow.com/questions/1841461/unsigned-short-in-java/…
    • 不管“预期用途”如何,事实是 char 16 位无符号整数。虽然我同意使用 char 存储二进制数据不是一个好方法,但说“字符和整数之间的转换使用 Unicode 值”具有误导性。从 int 转换为 char 会导致 JLS (java.sun.com/docs/books/jls/second_edition/html/…) 定义的缩小原始转换。
    【解决方案3】:

    您在演员表中搜索的不是转换,而是转换。

    有一个 String 构造函数,它接受一个字节数组和一个字符集编码。这应该对您有所帮助。

    【讨论】:

    • 谢谢,我确实找到了这种方法。我只是想知道是否有办法改变强制转换的工作方式,因为这意味着我可以通过简单的修改来改进我现有的实现。
    【解决方案4】:

    我正在做一个项目,其中我 读入一串二进制字符, 将其转换为块,然后转换 将块转换为它们的值 十进制,整数,然后我将其转换为 字符。然后我需要能够 “展开”产生的压缩 通过反转将字符恢复为二进制 过程。

    你没有提到为什么你这样做,而且(说实话)很难理解你试图描述的内容(一方面,我不明白为什么生成的字符会以任何方式“压缩”。

    如果您只想将二进制数据表示为文本,有很多 standard ways 可以实现这一点。但听起来你可能在追求别的东西?

    【讨论】:

    • 抱歉,我只是不想做一堵没有人有兴趣阅读的文字墙。
    • Errrr,没想到按回车会发帖,让我详细说明一下:该项目涉及霍夫曼编码;我们需要将文本从 .txt 文件转换为二进制文件,并能够解码该二进制文件以获取原始文本。如果我们可以以压缩形式存储编码文本,则提供了奖励,我决定简单地以块的形式获取二进制文件,而不是打印零和一,而是取二进制块的十进制值并将其转换为字符,给我一个角色。这就是我所说的压缩。
    • 是的,我发现还有其他方法可以实现这一点,但此时我已经完成了项目,但是由于某些值不会产生字符,当转换为字符时,保留该值,我只能通过一次使用 6 个二进制字符来使其工作。我只是想知道是否有一种方法可以强制强制转换使用其他字符集,所以我可以尝试找到一个适用于例如 8 块的方法。
    • 啊,好的,所以文件是带有'1'和'0'字符的文本文件,而不是二进制文件?为什么不将其存储为实际的二进制文件?将每组 8 位字符转换为一个字节值并将其存储为一个字节(例如,使用 FileOutputStream)。如前所述,当转换为 char 时,您不会转换为字符集,而只是转换为整数值(在打印时转换为特定的字符编码),所以如果您遇到在 Unicode 中不可打印的字符,随机选择不同的字符集不太可能有帮助。
    • 如果您确实需要将数据存储为文本,Base64 编码是确保您只使用可打印字符的常用方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2013-04-15
    • 1970-01-01
    • 2013-08-01
    • 2014-05-02
    相关资源
    最近更新 更多