diff --git a/OpenMetaverse.StructuredData/LLSD/BinaryLLSD.cs b/OpenMetaverse.StructuredData/LLSD/BinaryLLSD.cs index 65eb820d..c340f8e6 100644 --- a/OpenMetaverse.StructuredData/LLSD/BinaryLLSD.cs +++ b/OpenMetaverse.StructuredData/LLSD/BinaryLLSD.cs @@ -148,12 +148,7 @@ namespace OpenMetaverse.StructuredData break; case OSDType.Real: stream.WriteByte(realBinaryMarker); - byte[] bytes = osd.AsBinary(); - - if(BitConverter.IsLittleEndian) - Array.Reverse(bytes); - - stream.Write(bytes, 0, doubleLength); + stream.Write(osd.AsBinary(), 0, doubleLength); break; case OSDType.UUID: stream.WriteByte(uuidBinaryMarker); diff --git a/OpenMetaverse.StructuredData/StructuredData.cs b/OpenMetaverse.StructuredData/StructuredData.cs index d548e683..11179ecc 100644 --- a/OpenMetaverse.StructuredData/StructuredData.cs +++ b/OpenMetaverse.StructuredData/StructuredData.cs @@ -391,7 +391,7 @@ namespace OpenMetaverse.StructuredData public override ulong AsULong() { return (ulong)value; } public override double AsReal() { return (double)value; } public override string AsString() { return value.ToString(); } - public override byte[] AsBinary() { return Utils.IntToBytes(value); } + public override byte[] AsBinary() { return Utils.IntToBytesBig(value); } public override string ToString() { return AsString(); } } @@ -458,7 +458,7 @@ namespace OpenMetaverse.StructuredData public override double AsReal() { return value; } public override string AsString() { return value.ToString(Utils.EnUsCulture); } - public override byte[] AsBinary() { return Utils.DoubleToBytes(value); } + public override byte[] AsBinary() { return Utils.DoubleToBytesBig(value); } public override string ToString() { return AsString(); } } @@ -627,13 +627,7 @@ namespace OpenMetaverse.StructuredData public override byte[] AsBinary() { TimeSpan ts = value.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); - - byte[] bytes = Utils.DoubleToBytes(ts.TotalSeconds); - - if (BitConverter.IsLittleEndian) - Array.Reverse(bytes); - - return bytes; + return Utils.DoubleToBytesBig(ts.TotalSeconds); } public override DateTime AsDate() { return value; } diff --git a/OpenMetaverse/Types/UtilsConversions.cs b/OpenMetaverse/Types/UtilsConversions.cs index a238e385..2e324a06 100644 --- a/OpenMetaverse/Types/UtilsConversions.cs +++ b/OpenMetaverse/Types/UtilsConversions.cs @@ -276,8 +276,22 @@ namespace OpenMetaverse bytes[2] = (byte)((value >> 16) % 256); bytes[3] = (byte)((value >> 24) % 256); - if (BitConverter.IsLittleEndian) - Array.Reverse(bytes); + return bytes; + } + + /// + /// Convert an integer to a byte array in big endian format + /// + /// The integer to convert + /// A four byte big endian array + public static byte[] IntToBytesBig(int value) + { + byte[] bytes = new byte[4]; + + bytes[0] = (byte)((value >> 24) % 256); + bytes[1] = (byte)((value >> 16) % 256); + bytes[2] = (byte)((value >> 8) % 256); + bytes[3] = (byte)(value % 256); return bytes; } @@ -378,6 +392,14 @@ namespace OpenMetaverse return bytes; } + public static byte[] DoubleToBytesBig(double value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + return bytes; + } + public static void DoubleToBytes(double value, byte[] dest, int pos) { byte[] bytes = DoubleToBytes(value);