gpt4 book ai didi

java - C# BitConverter 到 Java

转载 作者:行者123 更新时间:2023-12-02 03:00:57 25 4
gpt4 key购买 nike

我正在尝试将一些使用 BitConverter 的现有 C# 代码移植到 Java。我发现了各种其他线程,但后来偶然发现了一个 github 类,它似乎可以解决这个问题。但是,ToUInt16 与我的 C# 代码的输出不匹配。 ToInt16 和 ToInt32 似乎返回相同的值。你能帮我理解这个实现有什么问题(或者可能是我做错了什么)吗?

代码引用:Java BitConverter

ToUInt16:

public static int ToUInt16(byte[] bytes, int offset) {
int result = (int)bytes[offset+1]&0xff;
result |= ((int)bytes[offset]&0xff) << 8;
if(Lysis.bDebug)
System.out.println(result & 0xffff);
return result & 0xffff;
}

ToUInt32:

public static long ToUInt32(byte[] bytes, int offset) {
long result = (int)bytes[offset]&0xff;
result |= ((int)bytes[offset+1]&0xff) << 8;
result |= ((int)bytes[offset+2]&0xff) << 16;
result |= ((int)bytes[offset+3]&0xff) << 24;
if(Lysis.bDebug)
System.out.println(result & 0xFFFFFFFFL);
return result & 0xFFFFFFFFL;
}

MyCode 片段:

byte[] byteArray = from some byte array
int offset = currentOffset
int msTime = BitConverter.ToUInt16(byteArray, offset)

msTime 与 C# 中的时间不匹配

C# 示例(来自供应商的字符串使用 Convert.FromBase64String 从字符串转换而来)

byte[] rawData = Convert.FromBase64String(vendorRawData);
byte[] sampleDataRaw = rawData;

Assert.AreEqual(15616, sampleDataRaw.Length);

//Show byte data for msTime
Console.WriteLine(sampleDataRaw[7]);
Console.WriteLine(sampleDataRaw[6]);

//Show byte data for msTime
Console.WriteLine(sampleDataRaw[14]);
Console.WriteLine(sampleDataRaw[13]);

var msTime = BitConverter.ToUInt16(sampleDataRaw, 6);
var dmWindow = BitConverter.ToUInt16(sampleDataRaw, 13);
Assert.AreEqual(399, msTime);
Assert.AreEqual(10, dmWindow);

字节值的 C# 控制台输出:

1
143
0
10

Groovy 示例(来自供应商的字符串使用 groovy DecodeBase64() 从字符串转换而来)

    def rawData = vendorRawData.decodeBase64()
def sampleDataRaw = rawData
Assert.assertEquals(15616, rawData.length)

//Show byte data for msTime
println sampleDataRaw[7]
println sampleDataRaw[6]

//Show byte data for dmWindow
println sampleDataRaw[14]
println sampleDataRaw[13]

def msTime = ToUInt16(sampleDataRaw, 6)
def dmWindow = ToUInt16(sampleDataRaw, 13)
Assert.assertEquals(399, msTime)
Assert.assertEquals(10, dmWindow)

**Asserts fail with**

399 fro msTime is actually 36609
10 from dmWindow is actually 2560

Groovy 从 println 中的字节值输出

1
-113
0
10

最佳答案

两种方法之间存在差异。第一个 ToUInt16 采用大端字节顺序。即第一个字节是最高有效字节。

但是ToUInt32采用小端字节顺序(一个奇怪的选择)。因此第一个字节是最不重要的。

正确的实现如下所示:

public static long toUInt32(byte[] bytes, int offset) {
long result = Byte.toUnsignedLong(bytes[offset+3]);
result |= Byte.toUnsignedLong(bytes[offset+2]) << 8;
result |= Byte.toUnsignedLong(bytes[offset+1]) << 16;
result |= Byte.toUnsignedLong(bytes[offset]) << 24;
return result;
}

数组索引“反转”。

(我还更改了看起来很怪异的位掩码,以更清晰地调用 Byte.toUnsignedLong,它执行相同的操作。)

关于java - C# BitConverter 到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42369863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com