首页 > 解决方案 > 在 CSharp 和 Java 中将字符串转换为 Long

问题描述

我正在尝试将字符串转换为 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);
}

测试是红色的。

有什么办法可以工作吗?有替代方案吗?

编辑:仅供参考:两个字节数组都相等,因此错误必须在从 byte[] 到 long 的转换中

标签: c#arraysstringlong-integer

解决方案


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);

推荐阅读