在 CSharp 和 Java 中将字符串转换为 Long

Converting String To Long in CSharp and Java

我正在尝试将字符串转换为 c# 和 java 中的数值,条件是转换必须相等。 以下 Java - 测试运行:

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

import org.junit.Test;

public class JavaTest {

    @Test
    public void TestJava(){
        byte[] bytes = "ABCDEFGH".getBytes(StandardCharsets.UTF_8);
        ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
        buffer.put(bytes);
        long value = buffer.getLong(0);
        assertThat(value, is(4702394921427289928L));
    }
}

当我尝试使用 BitConverter 在 C# 中转换相同的值时

[Test]
public void TestCSharp()
{
    byte[] byteContents = Encoding.UTF8.GetBytes("ABCDEFGH");
    long value = BitConverter.ToInt64(byteContents);

    Assert.AreEqual(value, 4702394921427289928L);
}

测试是红色的。

这有什么办法吗?有替代方案吗?

编辑: fyi:两个字节数组相等,所以错误必须在从 byte[] 到 long

的转换中

Java 中的 ByteBuffer 以 Big-Endian 顺序保存数据。 BitConverter 依赖于计算机架构,通常是 Little-Endian(正确的方法是检查 BitConverter.IsLittleEndian 属性)。

因此,要获得与 Java 相同的 C# 输出 - 您必须反转字节顺序:

long value = BitConverter.ToInt64(byteContents.Reverse().ToArray(), 0);

更正确的方法是检查 BitConverter.IsLittleEndian 来完成任务:

long value =
    BitConverter.ToInt64(
        BitConverter.IsLittleEndian
            ? byteContents.Reverse().ToArray()
            : byteContents,
        0);