Tag: 字节

Java将int隐式转换为byte

我即将开始处理需要读取字节和创建字符串的事情。 正在读取的字节代表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的东西都需要显式强制转换?

Java中是否存在基于8位字节数组的字符串类型?

Java(标准或其他)中的字符串类型/类是否基于8位字节类型的数组,而不是16位字符类型? 我非常喜欢C ++中的std :: string类型,因为它可以很好地解析base256(二进制)数据…… 我继续写了一个小课程,提供了我需要的大部分function(下图),但是更好的一个将不胜感激! public class stdstring extends Object { private byte [] bytedata; public stdstring() { bytedata = new byte[0]; } public stdstring(byte[] bytes) { bytedata = bytes; } public stdstring(byte[] bytes, int offset, int length) { bytedata = new byte[length]; System.arraycopy(bytes,offset,bytedata,0,length); } public stdstring(String string) throws UnsupportedEncodingException { bytedata = new […]

Java中的字节默认情况下占用4个字节?

可能重复: 内存中字节的大小 – Java 我在一篇文章中读到了这个。 我只是按原样粘贴: 该类占用至少8个字节。 所以,如果你说**new Object();**你将在堆上分配8个字节。 每个数据成员占用4个字节,long和double除外,占用8个字节。 即使数据成员是一个字节,它仍然会占用4个字节! 此外,使用的内存量以8字节块增加。 因此,如果你有一个包含一个字节的类,它将占用该类8个字节,数据占8个字节,总共16个字节(呻吟!)。 它是真的Java字节分配/占用4个字节? 而空类需要8个字节? 这里也很混乱。

缩放数组(矩阵)

这个程序的目的是创建一个比原始数组放大10倍的更大字节数组。 例如,[0] [0]中的1应该是新数组中1x的10×10平方。 我提供了代码和输出,它似乎在较大数组的填充期间正常工作,但随后打印不同的值。 我目前正在试验这些行,以便限制我在测试期间处理的变量数量。 任何人都可以想到这种情况发生的原因吗? public class Test { static byte[][] byteArray = {{1, 0}, {0, 1}}; public static void main(String[] args) { byte newarray[][] = converter(); for(int i = 0; i < 20; i++) { System.out.println(newarray[i][0]); } } private static byte[][] converter() { byte[][] b = new byte[20][20]; for(int r = 0; r […]

字符串到二进制,反之亦然:扩展ASCII

我想通过将String放入一个字节数组( String.getBytes[] )将String转换为二进制,然后将每个字节的二进制字符串( Integer.toBinaryString(bytearray) )存储在String []中。 然后我想通过Byte.parseByte(stringarray[i], 2)转换回普通的String。 这适用于标准ASCII表,但不适用于扩展的表。 例如, A给我1000001 ,但是Ä返回 11111111111111111111111111000011 11111111111111111111111110000100 任何想法如何管理? public class BinString { public static void main(String args[]) { String s = “ä”; System.out.println(binToString(stringToBin(s))); } public static String[] stringToBin(String s) { System.out.println(“Converting: ” + s); byte[] b = s.getBytes(); String[] sa = new String[s.getBytes().length]; for (int i = 0; […]

Java字节到字符串

所以我想将DatagramPacket的getData()函数返回的字节数组转换为字符串。 我知道将整个字节数组转换为字符串的方法就是: String str = new String(bytes); 但是,这会在最后打印出空字符。 所以如果字节数组是 [114, 101, 113, 117, 101, 115, 116, 0, 0, 0] 0打印出控制台上的空框。 所以我基本上只想打印出来: [114, 101, 113, 117, 101, 115, 116] 所以我做了这个function: public void print(DatagramPacket d) { byte[] data = d.getData(); for(int i=0; i< d.getLength(); i++) { if(data[i] != 0) System.out.println( data[i] ); } } 但不幸的是,这是打印出实际数字而不是字母。 那么如何将每个字节转换为字符串并将其打印出来。 或者,如果有另一种方法来打印字节数组而不是最后的空值那么那也没关系。

在JAVA中将短数组转换为字节数组

我对如何将short数组转换为byte数组感到困惑。 例如,我有以下shortarrays short[] shrt_array = new short[]{ 0x4 , 0xd7 , 0x86, 0x8c, 0xb2, 0x14, 0xc, 0x8b, 0x2d, 0x39, 0x2d, 0x2d, 0x27, 0xcb, 0x2e, 0x79, 0x46, 0x36, 0x9d , 0x62, 0x2c }; 通过使用此链接将短数组转换为字节数组这两种转换方法,我得到以下两个不同的byte数组: expectedByteArray = new byte[] { (byte) 0x4, (byte) 0xd7, (byte) 0x86, (byte) 0x8c, (byte) 0xb2, (byte) 0x14, (byte) 0xc, (byte) 0x8b, (byte) […]

Java(J2ME)将Image转换为byte ,然后返回Image

我正在尝试将Image对象转换为字节数组,然后再转换为Image(以便我可以将图像存储在Apache Derby数据库中的blob对象中)。 我可以将Image转换为字节数组(下面的代码),但我无法将字节转换回图像。 作为一个更复杂的我正在使用J2ME,所以我不能使用javax.image。*。 你能帮我吗? 谢谢 package six.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import java.awt.Component; import java.awt.MediaTracker; import java.awt.Graphics; import java.awt.image.DataBufferByte; import java.awt.image.WritableRaster; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.image.PixelGrabber; import java.util.ArrayList; public class ImageConverter extends Component { private MediaTracker mediaTracker; private Image image; private ImageConverter(Image image) { super(); this.mediaTracker = new MediaTracker(this); […]

用Java清除数据报缓冲区

所以我从互联网上获得了这个简单的udp客户端/服务器代码,它可以工作。 但是,当我输入比我之前输入的东西短的东西时,我会剩下剩下的字符。 例如,如果我先输入: kitty 然后输入: cat 第二个印刷品如下: catty 我一直在寻找其他有类似问题的人,他们中的大多数似乎都是通过清除字节数组来解决的。 但是,如果我尝试实现他们的答案,它不能解决我的问题。 我需要做什么,并且(可能更重要的是)代码应该去哪里? 这是代码: 客户: import java.io.*; import java.net.*; class UDPClient { public static void main(String args[]) throws Exception { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName(“localhost”); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence […]

invokestatic on interface中的静态方法

反汇编一些Java 8代码我发现一些对接口中静态方法的invokestatic调用(特别是java.util.function.Function.identity() )在const pool中使用了InterfaceMethodRef; 这就是javap -s -c -vp向我展示的内容: 15: invokestatic #66 // InterfaceMethod java/util/function/Function.identity:()Ljava/util/function/Function; 根据JVM 8规范,这是不可能的,当我在带有Java 7 major version=51 ( major version=51 )的classfile中使用此指令时,它已在此指令上抛出VerifyError。 然而,当我将主要版本更改为52 ,它开始像魅力一样工作。 请注意,我在Oracle JDK 1.8.0_60上运行。 我想知道为什么需要这个更改(调用的方法是静态链接的,不是吗?)以及是否记录在任何地方。