遵循问题https://stackoverflow.com/questions/1738244/what-is-the-java-equivalent-of-net-bitconverter中提供的建议,我已经开始实现我自己的Java位转换器,但没有得到相同的结果。
有没有人能给我指点一下我可能做错了什么?
public static byte[] GetBytes(Integer value) {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
DataOutputStream stream = new DataOutputStream(byteStream);
try {
stream.writeInt(value);
} catch (IOException e) {
return new byte[4];
}
return byteStream.toByteArray();
}
byte[] result = BitConverter.GetBytes(1234); //JAVA: [0, 0, 4, -46]
byte[] result = BitConverter.GetBytes(1234); //C#: [210, 4, 0, 0]发布于 2011-05-03 14:16:30
这只是字节序(-46和210是因为Java的有符号字节,但这只是一个UI问题)。反转数组内容,或者使用移位操作写入int。
注意:.NET发出的字节顺序取决于平台。我建议在这两种情况下都使用已知的ENDIANNESS;最有可能的是在这两种情况下都使用shift操作。或者可能是一个更好的想法:只使用预先设定的、独立于平台的序列化格式(例如: protocol buffers,它在Java和.NET/C#上都有很好的支持)。
例如,如果我向byte[] buffer编写int value (从offset开始),我可能会使用:
buffer[offset++] = (byte)value;
buffer[offset++] = (byte)(value>>8);
buffer[offset++] = (byte)(value>>16);
buffer[offset++] = (byte)(value>>24);这是保证低端的,类似的代码应该可以在任何框架上工作。
发布于 2011-05-03 14:27:17
C# BitConverter将使用基础架构的字节顺序。在大多数环境中,它都是小端的(就像您的情况一样)。然而,Java的DataOutputStream将始终以大端(“可移植方式”)编写。如果想要匹配行为,则需要检查机器的字节顺序并编写相应的代码。
另外,java中的字节是有符号的,所以输出只是表面上的不同。位的表示是相同的,所以你不需要担心。
要检查机器的字节顺序,请使用java.nio.ByteOrder.nativeOrder()方法。然后使用java.nio.ByteBuffer,您可以在其中指定字节order()并写入数据。
然后你可以像这样实现你的方法:
public static byte[] GetBytes(int value)
{
ByteBuffer buffer = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder());
buffer.putInt(value);
return buffer.array();
}发布于 2016-06-28 21:56:59
如果有任何指向JAVA BitConverter.ToInt32的主体need..C#
public static int toInt32_2(byte[] bytes, int index)
{
int a = (int)((int)(0xff & bytes[index]) << 32 | (int)(0xff & bytes[index + 1]) << 40 | (int)(0xff & bytes[index + 2]) << 48 | (int)(0xff & bytes[index + 3]) << 56);
// int a = (int)((int)(0xff & bytes[index]) << 56 | (int)(0xff & bytes[index + 1]) << 48 | (int)(0xff & bytes[index + 2]) << 40 | (int)(0xff & bytes[index + 3]) << 32);
//Array.Resize;
return a;
}也就是Int16
public static short toInt16(byte[] bytes, int index) //throws Exception
{
return (short)((bytes[index + 1] & 0xFF) | ((bytes[index] & 0xFF) << 0));
//return (short)(
// (0xff & bytes[index]) << 8 |
// (0xff & bytes[index + 1]) << 0
//);
}BitConverter.getBytes
public static byte[] GetBytesU16(long value)
{
ByteBuffer buffer = ByteBuffer.allocate(8).order(ByteOrder.nativeOrder());
buffer.putLong(value);
return buffer.array();
}https://stackoverflow.com/questions/5865728
复制相似问题