在我的项目中,我尝试将二进制数转换为整数并将整数转换为字符。但经过128号打印后只能'?'字符。请帮我打印最多250个字符。我的代码是
class b
{
public static void main(String[] args)
{
String dec1="11011001" ;
System.out.println(dec1);
int dec = Integer.parseInt(dec1, 2);
System.out.println(dec);
String str = new Character((char)dec).toString();
System.out.println("decrypted number is "+str);
}
}
谢谢。
答案 0 :(得分:3)
并非所有字节值都具有与之关联的可打印字符,ASCII不具有,许多/大多数unicode字节不具有,并且范围0x00-0x1f都是不可打印的控件,例如DC1,Bell,Backspace等.Unicode具有相同的前32个字符保留为不可打印。
高于127(0x7f)的字节值在不同的编码中具有不同的含义,编码很多。历史上,ASCII是默认编码,并且有许多扩展。目前标准是unicode,存在多种类型,包括UTF-8,UTF-16(LE,BE和BOM)和UTF-32(LE,BE和BOM)。 UTF8常用于交换,特别是在网络和UTF-16内部的许多系统中。
根据编码和字形(显示的表示),可能需要一个到超过16个字节来表示单个字形。表情符号主要位于代码平面1中,这意味着它们的代码点需要超过16位(unicode是一个21位编码系统)。此外,一些字形由一系列代码点表示,例子是将国家与旗帜组合在一起的标志,以及与“joiners”结合的表情符号。
在217(0xd9)的情况下,它不是UTF-8中的合法代码点,而217是两个字节(16位整数)(0x00d9)是Ù
的有效表示。
答案 1 :(得分:2)
问题是您的控制台编码与Java程序输出的编码不匹配。我不知道您使用的是哪个控制台,但在Windows上,您可以运行此命令来查看当前的编码:
chcp
美国的默认控制台编码为437,西欧和加拿大850编码。这些编码包含ASCII编码的128个字符和128个不同编码的字符。除了128个ASCII字符之外什么也得不到,因为Java输出的编码与控制台的编码不匹配。你必须改变其中一个以匹配另一个。
您可以通过运行以下命令将控制台的编码更改为UTF-8:
chcp 65001
如果您不在Windows上,则必须搜索系统的等效命令。但我相信大多数Linux&在Unix派生系统中,您可以使用locale
命令查看当前编码,并使用export
命令进行更改。
答案 2 :(得分:2)
根据您的代码,首先将二进制文件转换为Integer,然后将Integer转换为Character,这是通过检查ASCII值来完成的。
它将返回与您要转换的整数dec1
具有相同ASCII值的字符。由于在ASCII TABLE中值最多为127,因此您将获得整数值127的字符,因此,对于dec1
的较大值而不是127,您将得到?
字符,这将是然后转换为String。
前32个元素是不可打印的字符,所以你会得到一些奇怪的符号,但是对于32-126范围内dec1
的值,你将获得分配给该特定字符的字符根据{{3}}的ASCII值。由于值127被分配给DEL,因此您将获得值dec
127。
答案 3 :(得分:-1)
我从您的代码中收到以下输出。我假设您在不支持该角色的环境/控制台中运行该程序。您需要一个支持UTF-8,UTF-16或类似设备的控制台,以便能够打印您为其设置数值的所有字符。
11011001
217
decrypted number is Ù