我将开始处理需要读取字节并创建字符串的内容。读取的字节代表UTF-16字符串。因此,为了进行测试,我想将UTF-16编码的简单字节数组转换为字符串。数组中的前2个字节必须表示字节序,因此必须为0xff
0xfe或0xfe 0xff。所以我尝试如下创建字节数组:
byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};
但是我收到一个错误,因为0xFF和0xFE太大而无法容纳一个字节(因为字节是用Java签名的)。更准确地说,错误是int无法转换为字节。我知道我可以通过强制转换将int显式转换为byte并达到所需的结果,但这不是我的问题。
为了尝试一下,我创建了一个String并命名为getBytes(“
UTF-16”),然后将数组中的每个字节打印出来。输出有些混乱,因为前两个字节是0xFFFFFFFE 0xFFFFFFFF,然后是0x00 0x52
0x00 0x6F。(显然,这里的字节序与我上面尝试创建的字节序不同,但这并不重要)。
使用此输出,我决定尝试以相同的方式创建我的字节数组:
byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};
奇怪的是,它工作正常。所以我的问题是,为什么Java允许将0xFFFFFF80或更大的整数自动转换为字节而无需显式强制转换,但是等于或大于0x80的任何值都需要显式强制转换?
这里要记住的关键是int
在Java中是一个有符号的值。当分配0xffffffff
(这是2^32 -1
),这被翻译成一种价值符号int
-1
-一个int
不能真正代表什么大如0xffffffff
为正数。
因此,对于小于0x80且大于0xFFFFFF80的int
值,结果值介于-128和127之间,可以明确地将其表示为byte
。超出此范围的任何事物都不可能,并且需要强制使用显式强制转换,从而在此过程中丢失数据。
所以,问题是--为什么在I=L的情况下,当L的大小足够小到适合I时,必须显式地进行,但在F=L的情况下,当L的大小也适合F时,铸造可以隐式地进行,而不会产生错误。 我的意思是,在这两种情况下,右操作数的大小可能不适合左操作数。那么,为什么在一种情况下(I=L),强制转换必须显式进行,而在另一种情况下(F=L)可以隐式进行呢?虽然隐式地将长var转换为int var比隐式地将长var转换为浮点var
问题内容: 为什么当我使用这个: a强制转换为String,但是我不能在整数上使用toString()吗? 不这样:就像:? 问题答案: 不,它的工作方式类似于,而行为又类似。 要知道的重要一点是,它们都是由编译器完成的,换句话说,它就是语法糖。例如,这就是为什么在循环中将字符串添加在一起并不是一个好主意。(尽管现代VM可能具有某种机制来降低性能开销。)
问题内容: 您可以将int隐式转换为double: 您可以将int显式转换为double: 您可以将double显式转换为int: 为什么不能将一个double隐式转换为int? : 问题答案: 的范围比宽。这就是为什么您需要显式强制转换。由于相同的原因,您不能隐式地从转换为:
问题内容: 我正在尝试将int []转换为bytes。它也被转换。 我的转换代码是这样的。 假设我输入一个int [] = {10,11,15,41,12,8,4,23,5,17,23,36,6}现在我希望字节数组像这样{10,0 ,0,0,11,0,0,0,15,0,0,0,41,0,0,0,12,0,0,0,8,0,0,0,4,0,0 ,0,23,0,0,0,5,0,0,0,17,0,0,0,
问题内容: 我有一个以网络字节顺序包含IP地址的地址,我想将其转换为对象。我看到有一个采用的构造函数,是否有必要将转换为第一个,还是有其他方法? 问题答案: 这应该工作: 您可能需要交换字节数组的顺序,但我无法弄清楚是否会以正确的顺序生成该数组。
我有一个ArrayList ,希望将其转换为int[][]。结果数组中的每个条目都有相同的int[],尽管它们是不同的(是的,我已经检查过了!)。我是不是错过了一些简单的东西?int[][]中数组的长度由arr.length给出 编辑:我已经意识到代码可以正常工作,所以这里有一个更大的代码示例,出现问题的地方。permute()照它说的做,并在新的置换完成时,置换给定数组中的整数,返回true。