Java字节原始types是否有真正的生活用途?

由于某些不可理解的原因, byte原型types是用Java签名的。 这意味着有效值是-128..127,而不是通常的0..255范围,代表一个字节中的8个有效位(没有符号位)。

这意味着所有的字节操作代码通常会进行整数计算并最终屏蔽掉最后的8位。

我想知道是否有真正的生活场景的Java byte基元types完全适合,或者如果它只是一个完全无用的devise决定?


编辑:唯一的实际使用情况是本地代码的单字节占位符。 换句话说,不要把它作为Java代码中的一个字节来操纵。


编辑:我现在已经看到了一个地方,内部紧密循环需要除以7(数字0..32),所以一个查找表可以完成字节作为数据types,所以内存使用可以保持低考虑L1caching使用。 这不是指签名/无符号,而是实际使用的情况。

令人惊讶的是,上周我第一次在Java中使用了byte ,所以我确实有一个(虽然不常见)的用例。 我正在编写一个本地Java函数 ,它可以让你在一个可以被Java调用的库中实现一个函数。 Javatypes需要转换为本地语言的types,在这种情况下是C

该函数需要一个字节数组,但是(当时完全忘记了bytetypes)我得到了一个char[] 。 Java为C函数生成的签名将该参数的types设置为jcharArray ,该types可以转换为一堆jchar ,这些jni.hjni.hunsigned short 。 当然,这是不一样的大小 – 它是2个字节,而不是1.这导致了底层代码的各种问题。 使Javatypesbyte[]产生一个jbyteArray ,而Linux上的jbyte被typedef-ed为signed char ,这是正确的大小

乔希·布洛赫最近在演讲中提到 ,这是该语言中的一个错误。

我认为这背后的原因是,java没有无符号数字types, byte应符合该规则。 (注意: char是无符号的,但不代表数字)

至于特定的问题:我想不出任何例子。 即使有例子,它们也会less于0..255的,可以用掩蔽(而不是大多数)来实现,

byte, short, chartypes大多是无用的,除非在数组中使用以节省空间。

Java或JVM都没有任何真正的支持。 几乎所有对它们的操作都会首先将它们推到一个或多个位置。 我们甚至写不出类似的东西

  short a=1, b=2; a = a + b; // illegal a = a << 1; // illegal 

那么为什么甚至打扰到定义byte, short, chartypes的操作呢? 他们所做的一切正在扩大转换范围,这让程序员感到惊讶。

数字化的声音(或任何其他信号)与8位有符号样本似乎是我唯一合理的例子。 当然,对字节进行签名并不需要处理这些信号,因此可以说Java字节是否“完全适合”。

我个人认为没有签名是一个错误。 不仅因为有更多的使用无符号的字节/整数,而且因为我更喜欢更强大的types系统。 如果能够指定负数无效,并且允许编译器检查和运行时exception,这将是很好的。

byte在Java Card的小程序开发中有广泛的用途。 因为卡片资源有限,所以每一点内存都是宝贵的。 顺便说一下,卡处理器在处理整数值方面有局限性。 inttypes的支持是可选的, java.lang.String不受支持,所以整数操作和数据存储是由byteshortvariables和数组完成的。 由于整数文字是inttypes的,所以它们应该在整个代码中明确地转换为byte或者short 。 与卡通信通过APDU命令传递给小程序作为byte数组,应分解为byte s来解码命令类,指令和参数。 看下面的代码,你会看到有多lessbyteshorttypes对于Java Card开发来说很重要:

 package somepackage.SomeApplet; import javacard.framework.*; import org.globalplatform.GPSystem; import org.globalplatform.SecureChannel; public class SomeApplet extends Applet { // Card status private final static byte ST_UNINITIALIZED = (byte) 0x01; private final static byte ST_INITIALIZED = (byte) 0x02; // Instructions & Classes private final static byte PROP_CLASS = (byte) 0x80; private final static byte INS_INIT_UPDATE = (byte) 0x50; private final static byte INS_EXT_AUTH = (byte) 0x82; private final static byte INS_PUT_DATA = (byte) 0xDA; private final static byte INS_GET_RESPONSE = (byte) 0xC0; private final static byte INS_GET_DATA = (byte) 0xCA; private final static short SW_CARD_NOT_INITIALIZED = (short) 0x9101; private final static short SW_CARD_ALREADY_INITIALIZED = (short) 0x9102; private final static byte OFFSET_SENT = 0x00; private final static byte OFFSET_RECV = 0x01; private static short[] offset; private static byte[] fileBuffer; private static short fileSize = 0; public static void install(byte[] bArray, short bOffset, byte bLength) { new SomeApplet( bArray, bOffset, bLength); } public RECSApplet(byte[] bArray, short bOffset, byte bLength) { offset = JCSystem.makeTransientShortArray((short) 2, JCSystem.CLEAR_ON_RESET); fileBuffer = new byte[FILE_SIZE]; byte aidLen = bArray[bOffset]; if (aidLen== (byte)0){ register(); } else { register(bArray, (short)(bOffset+1), aidLen); } } public void process(APDU apdu) { if (selectingApplet()) { return; } byte[] buffer = apdu.getBuffer(); short len = apdu.setIncomingAndReceive(); byte cla = buffer[ISO7816.OFFSET_CLA]; byte ins = buffer[ISO7816.OFFSET_INS]; short lc = (short) (buffer[ISO7816.OFFSET_LC] & 0x00ff); while (len < lc) { len += apdu.receiveBytes(len); } SecureChannel sc = GPSystem.getSecureChannel(); if ((short)(cla & (short)0x80) == ISO7816.CLA_ISO7816) { switch (ins) { case INS_PUT_DATA: putData(buffer, ISO7816.OFFSET_CDATA, offset[OFFSET_RECV], len); if ((cla & 0x10) != 0x00) { offset[OFFSET_RECV] += len; } else { fileSize = (short) (offset[OFFSET_RECV] + len); offset[OFFSET_RECV] = 0; } return; case INS_GET_DATA: case INS_GET_RESPONSE: sendData(apdu); return; default: ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } } else if ((byte) (cla & PROP_CLASS) == PROP_CLASS) { switch (ins) { case INS_INIT_UPDATE: case INS_EXT_AUTH: apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, sc.processSecurity(apdu)); return; default: ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } } else ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED); } // Some code omitted } 

我认为它是为了与short和int一致而签署的。

至于是否使用了它,它使“字节数组”的概念成为一个构造而不是一个原始的。

这是我所有的。 🙂

在一个大于8位字的机器上,如果你希望将大量适合8位范围的值存储到单个数组中,那么这种方法会有所帮助,但是通常使用它们不是一个好主意,否则由于一个字节实际上是一个字节比int更省力地摆脱内存。

请记住,Java是为非常小的消费设备(机顶盒电视盒)而devise的。 我期望如果在小型8位微处理器上使用这种方法,它将会更加有用,因为它可以精确地匹配字的大小,并且可以用于非常小规模的一般“math”操作。

我能看到签名的唯一原因是一个无符号字节与一个int交互可能有点令人困惑 – 但我不相信这是一个比有签名的更令人困惑!

字节的大小是8位。 字节的大小有助于处理input和输出,同时执行写入文件或从文件读取等function。 考虑一个你想从键盘或任何文件读取input的场景。 如果使用“字节”数据结构,则由于大小为8位,所以您一次只能接收一个字符。 所以每次你收到一个inputstream,你就知道你实际上一次接收到一个字符。

我在为J2ME编写软件和游戏时经常使用它。 在大多数J2ME设备上,资源有限,所以比如将一个级别的地图存储在一个字节数组中比存储在一个int数组中的资源要less。

我现在在java中使用字节蓝牙android项目。