Convert Hex char To Int

#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the “Software”), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion

using System;
using System.Collections.Generic;
using System.Text;

namespace Newtonsoft.Json.Utilities
{
internal class MathUtils
{

public static int HexToInt(char h)
{
if ((h >= '0') && (h <= '9')) { return (h - '0'); } if ((h >= 'a') && (h <= 'f')) { return ((h - 'a') + 10); } if ((h >= 'A') && (h <= 'F')) { return ((h - 'A') + 10); } return -1; } } } [/csharp]

Hex Translator

//http://www.bouncycastle.org/
//MIT X11 License

using System;

namespace Org.BouncyCastle.Utilities.Encoders
{
///

/// A hex translator.
///

public class HexTranslator
{
private static readonly byte[] hexTable =
{
(byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7',
(byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f'
};

///

/// Return encoded block size.
///

/// 2
public int GetEncodedBlockSize()
{
return 2;
}

///

/// Encode some data.
///

/// Input data array. /// Start position within input data array. /// The amount of data to process. /// The output data array. /// The offset within the output data array to start writing from. /// Amount of data encoded.
public int Encode(
byte[] input,
int inOff,
int length,
byte[] outBytes,
int outOff)
{
for (int i = 0, j = 0; i < length; i++, j += 2) { outBytes[outOff + j] = hexTable[(input[inOff] >> 4) & 0x0f];
outBytes[outOff + j + 1] = hexTable[input[inOff] & 0x0f];

inOff++;
}

return length * 2;
}

///

/// Returns the decoded block size.
///

/// 1
public int GetDecodedBlockSize()
{
return 1;
}

///

/// Decode data from a byte array.
///

/// The input data array. /// Start position within input data array. /// The amounty of data to process. /// The output data array. /// The position within the output data array to start writing from. /// The amount of data written.
public int Decode(
byte[] input,
int inOff,
int length,
byte[] outBytes,
int outOff)
{
int halfLength = length / 2;
byte left, right;
for (int i = 0; i < halfLength; i++) { left = input[inOff + i * 2]; right = input[inOff + i * 2 + 1]; if (left < (byte)'a') { outBytes[outOff] = (byte)((left - '0') << 4); } else { outBytes[outOff] = (byte)((left - 'a' + 10) << 4); } if (right < (byte)'a') { outBytes[outOff] += (byte)(right - '0'); } else { outBytes[outOff] += (byte)(right - 'a' + 10); } outOff++; } return halfLength; } } } [/csharp]

Hex Encoder

//http://www.bouncycastle.org/
//MIT X11 License
using System;
using System.IO;

namespace Org.BouncyCastle.Utilities.Encoders
{
public class HexEncoder
{
private static readonly byte[] encodingTable =
{
(byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7',
(byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f'
};

/*
* set up the decoding table.
*/
internal static readonly byte[] decodingTable = new byte[128];

static HexEncoder()
{
for (int i = 0; i < encodingTable.Length; i++) { decodingTable[encodingTable[i]] = (byte)i; } decodingTable['A'] = decodingTable['a']; decodingTable['B'] = decodingTable['b']; decodingTable['C'] = decodingTable['c']; decodingTable['D'] = decodingTable['d']; decodingTable['E'] = decodingTable['e']; decodingTable['F'] = decodingTable['f']; } /** * encode the input data producing a Hex output stream. * * @return the number of bytes produced. */ public int Encode( byte[] data, int off, int length, Stream outStream) { for (int i = off; i < (off + length); i++) { int v = data[i]; outStream.WriteByte(encodingTable[v >> 4]);
outStream.WriteByte(encodingTable[v & 0xf]);
}

return length * 2;
}

private bool ignore(
char c)
{
return (c == '
' || c =='
' || c == ' ' || c == ' ');
}

/**
* decode the Hex encoded byte data writing it to the given output stream,
* whitespace characters will be ignored.
*
* @return the number of bytes produced.
*/
public int Decode(
byte[] data,
int off,
int length,
Stream outStream)
{
byte b1, b2;
int outLen = 0;
int end = off + length;

while (end > off)
{
if (!ignore((char)data[end – 1]))
{
break;
}

end–;
}

int i = off;
while (i < end) { while (i < end && ignore((char)data[i])) { i++; } b1 = decodingTable[data[i++]]; while (i < end && ignore((char)data[i])) { i++; } b2 = decodingTable[data[i++]]; outStream.WriteByte((byte)((b1 << 4) | b2)); outLen++; } return outLen; } /** * decode the Hex encoded string data writing it to the given output stream, * whitespace characters will be ignored. * * @return the number of bytes produced. */ public int DecodeString( string data, Stream outStream) { byte b1, b2; int length = 0; int end = data.Length; while (end > 0)
{
if (!ignore(data[end – 1]))
{
break;
}

end–;
}

int i = 0;
while (i < end) { while (i < end && ignore(data[i])) { i++; } b1 = decodingTable[data[i++]]; while (i < end && ignore(data[i])) { i++; } b2 = decodingTable[data[i++]]; outStream.WriteByte((byte)((b1 << 4) | b2)); length++; } return length; } } } [/csharp]