using System; using System.Collections.Generic; using System.Text; using libsecondlife; using libsecondlife.Packets; namespace OpenSim.Framework.Utilities { public class Util { private static Random randomClass = new Random(); private static uint nextXferID = 5000; private static object XferLock = new object(); public static ulong UIntsToLong(uint X, uint Y) { return Helpers.UIntsToLong(X, Y); } public static Random RandomClass { get { return randomClass; } } public static uint GetNextXferID() { uint id = 0; lock(XferLock) { id = nextXferID; nextXferID++; } return id; } public static int fast_distance2d(int x, int y) { x = System.Math.Abs(x); y = System.Math.Abs(y); int min = System.Math.Min(x, y); return (x + y - (min >> 1) - (min >> 2) + (min >> 4)); } public static string FieldToString(byte[] bytes) { return FieldToString(bytes, String.Empty); } /// /// Convert a variable length field (byte array) to a string, with a /// field name prepended to each line of the output /// /// If the byte array has unprintable characters in it, a /// hex dump will be put in the string instead /// The byte array to convert to a string /// A field name to prepend to each line of output /// An ASCII string or a string containing a hex dump, minus /// the null terminator public static string FieldToString(byte[] bytes, string fieldName) { // Check for a common case if (bytes.Length == 0) return String.Empty; StringBuilder output = new StringBuilder(); bool printable = true; for (int i = 0; i < bytes.Length; ++i) { // Check if there are any unprintable characters in the array if ((bytes[i] < 0x20 || bytes[i] > 0x7E) && bytes[i] != 0x09 && bytes[i] != 0x0D && bytes[i] != 0x0A && bytes[i] != 0x00) { printable = false; break; } } if (printable) { if (fieldName.Length > 0) { output.Append(fieldName); output.Append(": "); } if (bytes[bytes.Length - 1] == 0x00) output.Append(UTF8Encoding.UTF8.GetString(bytes, 0, bytes.Length - 1)); else output.Append(UTF8Encoding.UTF8.GetString(bytes)); } else { for (int i = 0; i < bytes.Length; i += 16) { if (i != 0) output.Append(Environment.NewLine); if (fieldName.Length > 0) { output.Append(fieldName); output.Append(": "); } for (int j = 0; j < 16; j++) { if ((i + j) < bytes.Length) output.Append(String.Format("{0:X2} ", bytes[i + j])); else output.Append(" "); } for (int j = 0; j < 16 && (i + j) < bytes.Length; j++) { if (bytes[i + j] >= 0x20 && bytes[i + j] < 0x7E) output.Append((char)bytes[i + j]); else output.Append("."); } } } return output.ToString(); } public Util() { } } }