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