2010-11-21 95 views
1

问:在Java中将int转换为char时,似乎默认结果是与该int值对应的ASCII字符。我的问题是,是否有某种方法来指定铸造时要使用的不同字符集? (背景信息:我正在研究一个项目,在该项目中,我读取了一串二进制字符,将其转换为块,并将块转换为十进制的int值,然后将其转换为字符。然后,我需要能够通过反转过程将生成的压缩字符“扩展”回二进制。 我已经能够做到这一点,但目前我只能够将最多6个“位”压缩为单个字符,因为当我允许更大的数量时,有一些范围内的值看起来不能很好地被ASCII处理;它们变成了方框或问号,当它们被转换回int时,它们的原始值没有被保存如果我可以使用另一个字符集,我想我可以避免这个问题,并一次压缩8位二进制数,这是我的目标。)在java中将char转换为char - 我必须使用ASCII吗?

我希望这是清楚的,并提前感谢!

+3

“一串二进制字符”,是吧? – BalusC 2010-11-21 20:39:33

+0

整数> 0和<128甚至<255? – Cratylus 2010-11-21 21:33:58

回答

1

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

+0

他提到他*从int转换为char。这与字符集无关:字符只不过是16位整数;铸造只保留低16位并丢弃高16位。 – Grodriguez 2010-11-21 22:31:12

+0

@Grodriguez:'char'是一个16位整数*,其含义与文本*相关。事实上它是16位,这更像是一个历史性的巧合 - 它可能很容易就有24位。如果你只是想要一个16位整数,你应该使用“short”。使用'char'来存储任意的二进制数据不是一个好方法 - 这不是'char'设计的。 http://stackoverflow.com/questions/1841461/unsigned-short-in-java/1841471#1841471 – 2010-11-21 22:37:55

+0

无论“预期用途”,事实是char *是一个16位无符号整数。虽然我同意使用char来存储二进制数据不是一个好方法,但说“字符和整数之间的转换使用Unicode值”是误导性的。从int到char的转换导致由JLS(http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363)定义的缩小原始转换。 – Grodriguez 2010-11-22 07:12:44

3

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

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

参考文献:

+1

如果您向我们展示一些代码,或许我们可以更好地帮助您(http://sscce.org/) – Grodriguez 2010-11-21 20:39:32

0

什么你不投搜索,这是一个转换。

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

+0

谢谢,我确实了解了这种方法。我只是想知道是否有办法改变铸造的工作方式,因为这意味着我可以通过简单的修改来改进现有的实施。 – 2010-11-21 22:37:23

0

我的工作中,我的二进制字符的字符串 阅读项目, 其转换成块,并转换 大块到他们的价值观 十进制整数,然后我作为投 字符。然后,我需要能够通过反转 将 “结果”压缩的 字符“扩展”回二进制。

你不提为什么你正在做的,和(说实话),这是一个有点难以跟随你试图描述(对于一件事是什么,我不明白为什么所产生的字符将以任何方式被“压缩”。

如果您只是想将二进制数据表示为文本,那么有大量的standard ways即可完成此操作。

+0

对不起,我只是不想让墙上的文字没有人会对阅读感兴趣。 – 2010-11-21 22:26:31

+0

Errr,没有实现敲击Enter会张贴,让我详细说明:该项目涉及到霍夫曼编码;我们需要将.txt文件中的文本转换为二进制文件,并能够解码该二进制文件以获取原始文本。如果我们能够以压缩格式存储编码文本,我们提供了一项奖励,并且我决定只是简单地抓住二进制文件,而不是打印零点和一点数字,而是采用二进制块的十进制值并将其转换为字符,给我许多人一个角色。这就是我所说的压缩。 – 2010-11-21 22:30:20

+0

是的,我发现还有其他的方法可以达到这个目的,但是在这一点上我已经完成了这个项目,但是因为某些值不会产生一个字符,当它作为一个char被铸造出来时,它保留了这个值,我只能通过一次取6个二进制字符来工作。我只是想知道是否有强制转换使用其他字符集的方法,所以我可以尝试找到一个适用于例如大块8的方法。 – 2010-11-21 22:34:50