0

我的问题是关于 Java 的。

我需要一种方法,该方法返回从字节数组中指定位置的两个字节转换而来的无符号 16 位整数。

换句话说,我需要适用于 Java 7 的 C# 的方法 BitConverter.ToUInt16 的等效方法。

在 C# 中

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;

namespace CSharp_Shell
{

    public static class Program 
    {
        public static void Main() 
        {
           byte[] arr = { 10, 20, 30, 40, 50};
           ushort res = BitConverter.ToUInt16(arr, 1);
           Console.WriteLine("Value = "+arr[1]);
           Console.WriteLine("Result = "+res);
        }
    }
}

我得到输出:

Value = 20
Result = 7700

但是当我把它翻译成Java

import java.util.*;

    public class Main
    {
        public static void main(String[] args)
        {
            byte[] arr = { 10, 20, 30, 40, 50};
            int tmp = toInt16(arr, 1);
            System.out.println(("Value = "+arr[1]));
            System.out.println(("Result = "+tmp));
        }
        
        public static short toInt16(byte[] bytes, int index) //throws Exception
        {
            return (short)((bytes[index + 1] & 0xFF) | ((bytes[index] & 0xFF) << 0));
            //return (short)(
            //        (0xff & bytes[index]) << 8 |
            //                (0xff & bytes[index + 1]) << 0
            //);
        }
    }

我期待与 C# 相同的输出,但我得到的不是输出:

Value = 20
Result = 30

如何使用 Java 获得相同的输出?

4

1 回答 1

0

Java 不提供对原始无符号整数值的支持,但您可以利用Integer该类来处理无符号值。也就是说,您可以调整一个模拟 C# 中行为的包装类。

正如 codeflush.dev 提到的,您需要移动高阶位。

public class BitConverter {
    /**
     * Returns a 16-bit "unsigned" integer converted from two bytes at a specified position in a byte array.
     *
     * @param value      The array of bytes.
     * @param startIndex The starting position within value.
     * @return A 16-bit "unsigned" integer formed by two bytes beginning at startIndex.
     * @throws IndexOutOfBoundsException
     * @see <a href="https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter.touint16?view=netcore-3.1">
     * BitConverter.ToUInt16(Byte[], Int32)</a>
     */
    public static final short toInt16(byte[] value, int startIndex) throws IndexOutOfBoundsException {
        if (startIndex == value.length - 1) {
            throw new IndexOutOfBoundsException(String.format("index must be less than %d", value.length - 2));
        }
        return (short) (((value[startIndex + 1] & 0xFF) << 8) | (value[startIndex] & 0xFF));
    }
}
public class Main {
    public static void main(String[] args) {
        byte[] arr = {10, 20, 30, 40, 50};
        int tmp = BitConverter.toInt16(arr, 1);
        System.out.println(("Value = " + arr[1])); // 20
        System.out.println(("Result = " + tmp));   // 7700
    }
}
于 2020-06-30T12:31:24.360 回答