【问题标题】:Access two first bytes in byte array访问字节数组中的前两个字节
【发布时间】:2021-10-26 12:03:34
【问题描述】:

我有一个 ByteArray 类型的变量:

val byteArray: ByteArray?

我目前正在访问它的第一个字节,索引如下:byteArray[0]。我希望能够得到这个字节数组的前两个字节。我应该获取字节 0 和 1 然后追加,还是可以以某种方式执行 byteArray[0:1]?我对 Java 和 Kotlin 非常陌生,不胜感激。

我需要能够获取前两个字节,这样我才能获取 0 到 16 位并将其转换为整数。 我用它来将字节转换为二进制字符串:

  `String.format("%8s", Integer.toBinaryString(inByte & 0xFF)).replace(' ', '0');`

【问题讨论】:

  • 不清楚你想做什么,或者最终结果是什么。您在寻找short(16 位整数)值吗?或者别的什么,如果是这样呢?在字节的上下文中,“附加”这个词对我来说没有意义。
  • 为什么获取get(0)get(1) 是个问题?我可以在这里提供答案,但为什么要提出问题而不是简单地前进呢?去吧,做你的工作,然后优化。如果您在这一点上 - 我的意思是优化 - 请提供更多代码...
  • 我很抱歉。更清楚一点:我想获取该字节数组中的前两个字节,因此我可以访问前 16 位并将其转换为整数。
  • 您的第一个建议,但我建议您阅读 Java 中数组的功能
  • @MichałZaborowski 我应该添加更多上下文。我需要位 0-16 将其转换为整数。如果我先得到字节 0,然后得到字节 1,而不将它们连接起来,我不知道该怎么做。我想知道是否有直接的方法可以一次获取字节 0 到 1。

标签: java kotlin


【解决方案1】:

如果您想要前两个字节的整数,只需使用ByteBuffer

// x is of type Short
val x = ByteBuffer.wrap(byteArray).short

这只会以大端顺序读取数组的前两个字节(您可以使用order 更改它),或者如果数组中的字节数少于 2 个则抛出异常。

【讨论】:

  • 谢谢!!字节的顺序是小端,但位是大端。所以我有 4 个字节,我需要按顺序读取字节 0 和 1,然后读取 16 位,保留最高有效位(大端)
  • @StephM 只需在.short 之前添加.order(ByteOrder.LITTLE_ENDIAN) 即可。 Are you sure bit order matters here?
【解决方案2】:

您可以使用destructuring 访问数组中的前两个字节。

要将它们转换为整数,可以使用toInt 转换第一个字节,shl 将其左移8位,然后添加第二个字节。

fun main() {
    val byteArray = byteArrayOf(0b00000001, 0b00000010, 0b00000011)
    val (firstByte, secondByte) = byteArray.toUByteArray()
    val firstTwoBytes = (firstByte.toInt() shl 8) + secondByte.toInt()
    println(firstByte)      // 00000001
    println(secondByte)     // 00000010
    println(firstTwoBytes)  // 0000000100000010
}

输出:

1
2
258

我在这里转换有符号字节数组toUByteArray(),因为toInt() 保留了有符号字节的数值,这意味着负字节会产生负整数,如果您只关心原始数据,这不是您想要的位。在这里你真正想要的是使用无符号字节。

如果你想避免转换整个数组,你可以这样做只转换前两个字节:

val firstTwoBytes = (firstByte.toUByte().toInt() shl 8) + secondByte.toUByte().toInt()

【讨论】:

    【解决方案3】:

    大端序

    byte[] bytes = new byte[] { 1, 2, 3, 4 };
    int shorty = ((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF);
    

    小端序

    byte[] bytes = new byte[] { 1, 2, 3, 4 };
    int shorty = ((bytes[1] & 0xFF) << 8) | (bytes[0] & 0xFF);
    

    【讨论】:

      【解决方案4】:

      您没有指定字节中位的顺序。取决于您是要使用大端还是小端

      int result = ((int)byteArray[1])*256+((int)byteArray[0])
      

      int result = ((int)byteArray[2])*256+((int)byteArray[1])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 2021-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多