Data Types C#

/*  
 * PERWAPI - An API for Reading and Writing PE Files
 * 
 * Copyright (c) Diane Corney, Queensland University of Technology, 2004.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the PERWAPI Copyright as included with this
 * distribution in the file PERWAPIcopyright.rtf.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY as is explained in the copyright notice.
 *
 * The author may be contacted at d.corney@qut.edu.au
 * 
 * Version Date:  26/01/07
 */
using System;
namespace QUT.PERWAPI
{
    /// 
    /// Facilities for outputting hexadecimal strings
    /// 

    public class Hex
    {
        readonly static char[] hexDigit = {'0','1','2','3','4','5','6','7',
                                              '8','9','A','B','C','D','E','F'};
        readonly static uint[] iByteMask = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 };
        readonly static ulong[] lByteMask = {0x00000000000000FF, 0x000000000000FF00, 
                                                0x0000000000FF0000, 0x00000000FF000000,
                                                0x000000FF00000000, 0x0000FF0000000000,
                                                0x00FF000000000000, 0xFF00000000000000 };
        readonly static uint nibble0Mask = 0x0000000F;
        readonly static uint nibble1Mask = 0x000000F0;
        /// 
        /// Derives a hexadecimal string for a byte value
        /// 

        /// the byte value
        /// hex string for the byte value
        public static String Byte(int b)
        {
            char[] str = new char[2];
            uint num = (uint)b;
            uint b1 = num & nibble0Mask;
            uint b2 = (num & nibble1Mask) >> 4;
            str[0] = hexDigit[b2];
            str[1] = hexDigit[b1];
            return new String(str);
        }
        /// 
        /// Derives a hexadecimal string for a short value
        /// 

        /// the short value
        /// hex string for the short value
        public static String Short(int b)
        {
            char[] str = new char[4];
            uint num1 = (uint)b & iByteMask[0];
            uint num2 = ((uint)b & iByteMask[1]) >> 8;
            uint b1 = num1 & nibble0Mask;
            uint b2 = (num1 & nibble1Mask) >> 4;
            uint b3 = num2 & nibble0Mask;
            uint b4 = (num2 & nibble1Mask) >> 4;
            str[0] = hexDigit[b4];
            str[1] = hexDigit[b3];
            str[2] = hexDigit[b2];
            str[3] = hexDigit[b1];
            return new String(str);
        }
        /// 
        /// Derives a hexadecimal string for an int value
        /// 

        /// the int value
        /// hex string for the int value
        public static String Int(int val)
        {
            char[] str = new char[8];
            uint num = (uint)val;
            int strIx = 7;
            for (int i = 0; i < iByteMask.Length; i++)
            {
                uint b = num & iByteMask[i];
                b >>= (i * 8);
                uint b1 = b & nibble0Mask;
                uint b2 = (b & nibble1Mask) >> 4;
                str[strIx--] = hexDigit[b1];
                str[strIx--] = hexDigit[b2];
            }
            return new String(str);
        }
        /// 
        /// Derives a hexadecimal string for an unsigned int value
        /// 

        /// the unsigned int value
        /// hex string for the unsigned int value
        public static String Int(uint num)
        {
            char[] str = new char[8];
            int strIx = 7;
            for (int i = 0; i < iByteMask.Length; i++)
            {
                uint b = num & iByteMask[i];
                b >>= (i * 8);
                uint b1 = b & nibble0Mask;
                uint b2 = (b & nibble1Mask) >> 4;
                str[strIx--] = hexDigit[b1];
                str[strIx--] = hexDigit[b2];
            }
            return new String(str);
        }
        /// 
        /// Derives a hexadecimal string for a long value
        /// 

        /// the long value
        /// hex string for the long value
        public static String Long(long lnum)
        {
            ulong num = (ulong)lnum;
            return Long(num);
        }
        /// 
        /// Derives a hexadecimal string for an unsigned long value
        /// 

        /// the unsigned long value
        /// hex string for the unsigned long value
        public static String Long(ulong num)
        {
            char[] str = new char[16];
            int strIx = 15;
            for (int i = 0; i < lByteMask.Length; i++)
            {
                ulong b = num & lByteMask[i];
                b >>= (i * 8);
                ulong b1 = b & nibble0Mask;
                ulong b2 = (b & nibble1Mask) >> 4;
                str[strIx--] = hexDigit[b1];
                str[strIx--] = hexDigit[b2];
            }
            return new String(str);
        }
}