c# - 在 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 的转换中
解决方案
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);
推荐阅读
- chef-infra - Chef/OpsWorks:实例在 dokku 部署上失败
- python - PyQt4中标签的自动调整大小
- r - 导入源脚本时出现字符串编码错误
- maven - 从 yaml 文件中获取值到 pom.xml
- javascript - 为什么单击 tab2 时总是显示 tab1 的内容?
- php - 如何在 foreach 循环中回显消息一次
- java - 打破 else-if 连接?(爪哇)
- reactjs - 如何在 React 项目中设置字体系列
- logging - 我需要在我的 Elixir 应用程序中包含 SASL 吗?
- apache-spark - basedir 必须是绝对的:?/.ivy2/local