261 lines
9.3 KiB
C#
261 lines
9.3 KiB
C#
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Research Singularity / Netstack
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// File: NetworkBitConverter.cs
|
||
|
//
|
||
|
|
||
|
using System;
|
||
|
|
||
|
#if SINGULARITY
|
||
|
using Microsoft.Singularity.Io;
|
||
|
#endif
|
||
|
|
||
|
namespace Drivers.Net
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Converts host ordered integer base types to network
|
||
|
/// ordered array of bytes, and vice-versa.
|
||
|
/// </summary>
|
||
|
public sealed class NetworkBitConverter
|
||
|
{
|
||
|
/// <returns>
|
||
|
/// Returns a host-order 16-bit signed integer converted from
|
||
|
/// two bytes in a byte array.
|
||
|
/// </returns>
|
||
|
public static short ToInt16(byte[] value, int startIndex)
|
||
|
{
|
||
|
return ByteOrder.BigEndianToHost(
|
||
|
BitConverter.ToInt16(value, startIndex)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns a host-order 16-bit unsigned integer converted from
|
||
|
/// two bytes in a byte array.
|
||
|
/// </returns>
|
||
|
public static ushort ToUInt16(byte[] value, int startIndex)
|
||
|
{
|
||
|
return ByteOrder.BigEndianToHost(
|
||
|
BitConverter.ToUInt16(value, startIndex)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns a host-order 32-bit signed integer converted from
|
||
|
/// two bytes in a byte array.
|
||
|
/// </returns>
|
||
|
public static int ToInt32(byte[] value, int startIndex)
|
||
|
{
|
||
|
return ByteOrder.BigEndianToHost(
|
||
|
BitConverter.ToInt32(value, startIndex)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns a host-order 32-bit unsigned integer converted from
|
||
|
/// two bytes in a byte array.
|
||
|
/// </returns>
|
||
|
public static uint ToUInt32(byte[] value, int startIndex)
|
||
|
{
|
||
|
return ByteOrder.BigEndianToHost(
|
||
|
BitConverter.ToUInt32(value, startIndex)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns a host-order 64-bit signed integer converted from
|
||
|
/// two bytes in a byte array.
|
||
|
/// </returns>
|
||
|
public static long ToInt64(byte[] value, int startIndex)
|
||
|
{
|
||
|
return ByteOrder.BigEndianToHost(
|
||
|
BitConverter.ToInt64(value, startIndex)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns a host-order 64-bit unsigned integer converted from
|
||
|
/// two bytes in a byte array.
|
||
|
/// </returns>
|
||
|
public static ulong ToUInt64(byte[] value, int startIndex)
|
||
|
{
|
||
|
return ByteOrder.BigEndianToHost(
|
||
|
BitConverter.ToUInt64(value, startIndex)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns network ordered bytes representing 16-bit signed integer.
|
||
|
/// </returns>
|
||
|
public static byte[] GetBytes(short value)
|
||
|
{
|
||
|
return BitConverter.GetBytes(
|
||
|
ByteOrder.HostToBigEndian(value)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns network ordered bytes representing 16-bit unsigned integer.
|
||
|
/// </returns>
|
||
|
public static byte[] GetBytes(ushort value)
|
||
|
{
|
||
|
return BitConverter.GetBytes(
|
||
|
ByteOrder.HostToBigEndian(value)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns network ordered bytes representing 32-bit signed integer.
|
||
|
/// </returns>
|
||
|
public static byte[] GetBytes(int value)
|
||
|
{
|
||
|
return BitConverter.GetBytes(
|
||
|
ByteOrder.HostToBigEndian(value)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns network ordered bytes representing 32-bit unsigned integer.
|
||
|
/// </returns>
|
||
|
public static byte[] GetBytes(uint value)
|
||
|
{
|
||
|
return BitConverter.GetBytes(
|
||
|
ByteOrder.HostToBigEndian(value)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns network ordered bytes representing 64-bit signed integer.
|
||
|
/// </returns>
|
||
|
public static byte[] GetBytes(long value)
|
||
|
{
|
||
|
return BitConverter.GetBytes(
|
||
|
ByteOrder.HostToBigEndian(value)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <returns>
|
||
|
/// Returns network ordered bytes representing 64-bit unsigned integer.
|
||
|
/// </returns>
|
||
|
public static byte[] GetBytes(ulong value)
|
||
|
{
|
||
|
return BitConverter.GetBytes(
|
||
|
ByteOrder.HostToBigEndian(value)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Convert a host-ordered 16-bit signed integer into network order
|
||
|
/// and place result in a byte array.
|
||
|
/// <param name = "value"> Value to be placed into byte array.</param>
|
||
|
/// <param name = "dstBuffer"> Byte array to receive value.</param>
|
||
|
/// <param name = "dstOffset"> Offset in buffer to place value.
|
||
|
/// </param>
|
||
|
/// </summary>
|
||
|
public static int PutBytes(short value,
|
||
|
byte[]! dstBuffer,
|
||
|
int dstOffset)
|
||
|
{
|
||
|
dstBuffer[dstOffset] = (byte) (value >> 8);
|
||
|
dstBuffer[dstOffset + 1] = (byte) value;
|
||
|
return 2;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Convert a host-ordered 16-bit unsigned integer into network order
|
||
|
/// and place result in a byte array.
|
||
|
/// <param name = "value"> Value to be placed into byte array.</param>
|
||
|
/// <param name = "dstBuffer"> Byte array to receive value.</param>
|
||
|
/// <param name = "dstOffset"> Offset in buffer to place value.
|
||
|
/// </param>
|
||
|
/// </summary>
|
||
|
public static int PutBytes(ushort value,
|
||
|
byte[]! dstBuffer,
|
||
|
int dstOffset)
|
||
|
{
|
||
|
dstBuffer[dstOffset] = (byte) (value >> 8);
|
||
|
dstBuffer[dstOffset + 1] = (byte) value;
|
||
|
return 2;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Convert a host-ordered 32-bit signed integer into network order
|
||
|
/// and place result in a byte array.
|
||
|
/// <param name = "value"> Value to be placed into byte array.</param>
|
||
|
/// <param name = "dstBuffer"> Byte array to receive value.</param>
|
||
|
/// <param name = "dstOffset"> Offset in buffer to place value.
|
||
|
/// </param>
|
||
|
/// </summary>
|
||
|
public static int PutBytes(int value,
|
||
|
byte[]! dstBuffer,
|
||
|
int dstOffset)
|
||
|
{
|
||
|
dstBuffer[dstOffset] = (byte) (value >> 24);
|
||
|
dstBuffer[dstOffset + 1] = (byte) (value >> 16);
|
||
|
dstBuffer[dstOffset + 2] = (byte) (value >> 8);
|
||
|
dstBuffer[dstOffset + 3] = (byte) (value);
|
||
|
return 4;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Convert a host-ordered 32-bit unsigned integer into network order
|
||
|
/// and place result in a byte array.
|
||
|
/// <param name = "value"> Value to be placed into byte array.</param>
|
||
|
/// <param name = "dstBuffer"> Byte array to receive value.</param>
|
||
|
/// <param name = "dstOffset"> Offset in buffer to place value.
|
||
|
/// </param>
|
||
|
/// </summary>
|
||
|
public static int PutBytes(uint value,
|
||
|
byte[]! dstBuffer,
|
||
|
int dstOffset)
|
||
|
{
|
||
|
dstBuffer[dstOffset] = (byte) (value >> 24);
|
||
|
dstBuffer[dstOffset + 1] = (byte) (value >> 16);
|
||
|
dstBuffer[dstOffset + 2] = (byte) (value >> 8);
|
||
|
dstBuffer[dstOffset + 3] = (byte) (value);
|
||
|
return 4;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Convert a host-ordered 64-bit signed integer into network order
|
||
|
/// and place result in a byte array.
|
||
|
/// <param name = "value"> Value to be placed into byte array.</param>
|
||
|
/// <param name = "dstBuffer"> Byte array to receive value.</param>
|
||
|
/// <param name = "dstOffset"> Offset in buffer to place value.
|
||
|
/// </param>
|
||
|
/// </summary>
|
||
|
public static int PutBytes(long value,
|
||
|
byte[]! dstBuffer,
|
||
|
int dstOffset)
|
||
|
{
|
||
|
PutBytes((int) (value >> 32), dstBuffer, dstOffset);
|
||
|
PutBytes((uint) (value), dstBuffer, dstOffset + 4);
|
||
|
return 8;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Convert a host-ordered 64-bit unsigned integer into network order
|
||
|
/// and place result in a byte array.
|
||
|
/// <param name = "value"> Value to be placed into byte array.</param>
|
||
|
/// <param name = "dstBuffer"> Byte array to receive value.</param>
|
||
|
/// <param name = "dstOffset"> Offset in buffer to place value.
|
||
|
/// </param>
|
||
|
/// </summary>
|
||
|
public static int PutBytes(ulong value,
|
||
|
byte[]! dstBuffer,
|
||
|
int dstOffset)
|
||
|
{
|
||
|
PutBytes((uint) (value >> 32), dstBuffer, dstOffset);
|
||
|
PutBytes((uint) (value), dstBuffer, dstOffset + 4);
|
||
|
return 8;
|
||
|
}
|
||
|
|
||
|
private NetworkBitConverter()
|
||
|
{
|
||
|
}
|
||
|
}
|
||
|
} // namespace Drivers.Net
|