将字节数组正确转换为长 C#
Converting correctly Byte array to long C#
我想在 C# 中将字节数组 (byte[]) 转换为 long。我已经能够研究这个并且这个线程不是重复的。事实上,我需要转换为 BigEndian,这是在 Java:
中以这种方式完成的
ByteBuffer buf = ByteBuffer.wrap(digest);
Long bufLong = buf.getLong(12); // int parameter = start index;
例如,这是一个 Java / C# 转换比较。
Java:
public static void testLong()
{
byte[] testLong = new byte[]{
(byte) 0xac, (byte) 0xe0, (byte) 0x46, (byte) 0x0b, (byte) 0xff,
(byte) 0x30, (byte) 0xbf, (byte) 0xbf, (byte) 0x86, (byte) 0xc3,
(byte) 0xaf, (byte) 0xf4, (byte) 0x6b, (byte) 0xfe, (byte) 0xc2,
};
ByteBuffer byteBuffer = ByteBuffer.wrap(testLong);
for (int i = 0; i < (testLong.length - 8); i++) {
System.out.println("i[" + i + "]: " + byteBuffer.getLong(i));
}
}
C#:
public static void TestLong()
{
byte[] testLong = new byte[]{
(byte) 0xac, (byte) 0xe0, (byte) 0x46, (byte) 0x0b, (byte) 0xff,
(byte) 0x30, (byte) 0xbf, (byte) 0xbf, (byte) 0x86, (byte) 0xc3,
(byte) 0xaf, (byte) 0xf4, (byte) 0x6b, (byte) 0xfe, (byte) 0xc2,
};
for (int i = 0; i < (testLong.Length - 8); i++)
{
Console.WriteLine($"I[{i}] : {BitConverter.ToInt64(testLong, i)}");
}
Array.Reverse(testLong);
Console.WriteLine("Reversing the array ...");
for (int i = 0; i < (testLong.Length - 8); i++)
{
Console.WriteLine($"I[{i}] : {BitConverter.ToInt64(testLong, i)}");
}
}
Java 输出(正确的一个):
i[0]: -5989710487062790209
i[1]: -2286126570181509242
i[2]: 5047408392239285955
i[3]: 864463253588591535
i[4]: -58335965835186188
i[5]: 3512736819901887595
i[6]: -4629833716884804610
C# 输出(不正确):
I[0] : -4629928019949592404
I[1] : -8737054534917208352
I[2] : -4357584761552696506
I[3] : -5781629338509050101
I[4] : -815218024020758273
I[5] : 7779035710689886000
I[6] : -113728329830973505
Reversing the array ...
I[0] : -4645810805098676542
I[1] : -4629833716884804610
I[2] : 3512736819901887595
I[3] : -58335965835186188
I[4] : 864463253588591535
I[5] : 5047408392239285955
I[6] : -2286126570181509242
请注意,我测试反转数组,因为 Java 是 BigEndian 而 C# 是 LittleEndian(可能也是我的问题的根源,但 idk)
如您所见,转换效果不佳。
我还尝试在 C# 中使用 ByteBuffer 端口但没有成功:https://github.com/google/flatbuffers/blob/master/net/FlatBuffers/ByteBuffer.cs
如果有人能帮我解决这个问题,我将不胜感激。
C# 不是 any endian - 除非你作弊并深入了解:endianness 不是你看到的一个因素; .NET 通常,特别是 BitConverter
,是 CPU-endian;大概你的 CPU 是小端。
所以:不要使用它! BinaryPrimitives
提供显式字节序 API;使用适合您场景的那些。
注意:当出于字节顺序原因反转数据时,您只会反转 那个段 ,而不是整个负载 - 这就是您的 Reverse
尝试失败的原因。
using System;
using System.Buffers.Binary;
ReadOnlySpan<byte> testLong = new byte[]{
0xac, 0xe0, 0x46, 0x0b, 0xff,
0x30, 0xbf, 0xbf, 0x86, 0xc3,
0xaf, 0xf4, 0x6b, 0xfe, 0xc2,
};
for (int i = 0; i < (testLong.Length - 8); i++)
{
Console.WriteLine($"I[{i}] : {BinaryPrimitives.ReadInt64BigEndian(testLong.Slice(i))}");
}
我想在 C# 中将字节数组 (byte[]) 转换为 long。我已经能够研究这个并且这个线程不是重复的。事实上,我需要转换为 BigEndian,这是在 Java:
中以这种方式完成的ByteBuffer buf = ByteBuffer.wrap(digest);
Long bufLong = buf.getLong(12); // int parameter = start index;
例如,这是一个 Java / C# 转换比较。 Java:
public static void testLong()
{
byte[] testLong = new byte[]{
(byte) 0xac, (byte) 0xe0, (byte) 0x46, (byte) 0x0b, (byte) 0xff,
(byte) 0x30, (byte) 0xbf, (byte) 0xbf, (byte) 0x86, (byte) 0xc3,
(byte) 0xaf, (byte) 0xf4, (byte) 0x6b, (byte) 0xfe, (byte) 0xc2,
};
ByteBuffer byteBuffer = ByteBuffer.wrap(testLong);
for (int i = 0; i < (testLong.length - 8); i++) {
System.out.println("i[" + i + "]: " + byteBuffer.getLong(i));
}
}
C#:
public static void TestLong()
{
byte[] testLong = new byte[]{
(byte) 0xac, (byte) 0xe0, (byte) 0x46, (byte) 0x0b, (byte) 0xff,
(byte) 0x30, (byte) 0xbf, (byte) 0xbf, (byte) 0x86, (byte) 0xc3,
(byte) 0xaf, (byte) 0xf4, (byte) 0x6b, (byte) 0xfe, (byte) 0xc2,
};
for (int i = 0; i < (testLong.Length - 8); i++)
{
Console.WriteLine($"I[{i}] : {BitConverter.ToInt64(testLong, i)}");
}
Array.Reverse(testLong);
Console.WriteLine("Reversing the array ...");
for (int i = 0; i < (testLong.Length - 8); i++)
{
Console.WriteLine($"I[{i}] : {BitConverter.ToInt64(testLong, i)}");
}
}
Java 输出(正确的一个):
i[0]: -5989710487062790209
i[1]: -2286126570181509242
i[2]: 5047408392239285955
i[3]: 864463253588591535
i[4]: -58335965835186188
i[5]: 3512736819901887595
i[6]: -4629833716884804610
C# 输出(不正确):
I[0] : -4629928019949592404
I[1] : -8737054534917208352
I[2] : -4357584761552696506
I[3] : -5781629338509050101
I[4] : -815218024020758273
I[5] : 7779035710689886000
I[6] : -113728329830973505
Reversing the array ...
I[0] : -4645810805098676542
I[1] : -4629833716884804610
I[2] : 3512736819901887595
I[3] : -58335965835186188
I[4] : 864463253588591535
I[5] : 5047408392239285955
I[6] : -2286126570181509242
请注意,我测试反转数组,因为 Java 是 BigEndian 而 C# 是 LittleEndian(可能也是我的问题的根源,但 idk)
如您所见,转换效果不佳。
我还尝试在 C# 中使用 ByteBuffer 端口但没有成功:https://github.com/google/flatbuffers/blob/master/net/FlatBuffers/ByteBuffer.cs
如果有人能帮我解决这个问题,我将不胜感激。
C# 不是 any endian - 除非你作弊并深入了解:endianness 不是你看到的一个因素; .NET 通常,特别是 BitConverter
,是 CPU-endian;大概你的 CPU 是小端。
所以:不要使用它! BinaryPrimitives
提供显式字节序 API;使用适合您场景的那些。
注意:当出于字节顺序原因反转数据时,您只会反转 那个段 ,而不是整个负载 - 这就是您的 Reverse
尝试失败的原因。
using System;
using System.Buffers.Binary;
ReadOnlySpan<byte> testLong = new byte[]{
0xac, 0xe0, 0x46, 0x0b, 0xff,
0x30, 0xbf, 0xbf, 0x86, 0xc3,
0xaf, 0xf4, 0x6b, 0xfe, 0xc2,
};
for (int i = 0; i < (testLong.Length - 8); i++)
{
Console.WriteLine($"I[{i}] : {BinaryPrimitives.ReadInt64BigEndian(testLong.Slice(i))}");
}