【问题标题】:Converting String To Long in CSharp and Java在 CSharp 和 Java 中将字符串转换为 Long
【发布时间】:2020-07-16 09:46:26
【问题描述】:

我试图在 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));
    }
}

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

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

    Assert.AreEqual(value, 4702394921427289928L);
}

测试是红色的。

有什么办法可以做到吗?有其他选择吗?

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

【问题讨论】:

  • 你得到了什么价值?你的预期正确吗?
  • 这个值对我来说并不重要,只要它在两个实现(c#,java)中是相等的
  • long value = BitConverter.ToInt64(byteContents.Reverse().ToArray(), 0);
  • @UlugbekUmirov 介意解释为什么会这样并将其作为答案发布?
  • 感谢m8 plz使用答案,所以我可以接受它

标签: c# arrays string long-integer


【解决方案1】:

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

【讨论】:

  • 我有一个后续问题:每个字符串生成的值是唯一的(是完美的哈希函数)还是两个字符串可以具有相同的长值?
  • 如果你得到的字符串长度超过 8 个字节——那么你就会遇到问题,因为你必须以某种方式截断它。在那之前 - 没关系。
猜你喜欢
  • 2016-04-06
  • 2013-08-14
  • 1970-01-01
  • 2020-12-02
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
相关资源
最近更新 更多