public static void Main()
var encoder = Encoding.ASCII.GetEncoder();
encoder.Fallback = new HexFallback();
var buffer = new byte[1000];
var length = encoder.GetBytes(str.ToCharArray(), 0, str.Length, buffer, 0, true);
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, length));
public class HexFallback : EncoderFallback
public override int MaxCharCount { get { return int.MaxValue; } }
public override EncoderFallbackBuffer CreateFallbackBuffer(){ return new HexFallbackBuffer(); }
public class HexFallbackBuffer : EncoderFallbackBuffer
public override bool Fallback(char charUnknown, int index)
_charToEncode = charUnknown;
public override bool Fallback(char charUnknownHigh, char charUnknownLow, int index)
_charToEncode = charUnknownHigh;
_charToEncode2 = charUnknownLow;
public override int Remaining { get { return 8 - _currentPos + (_charToEncode2 != (char)0 ? 8 : 0); } }
public override void Reset()
_charToEncode2 = (char)0;
public override bool MovePrevious()
public override char GetNextChar()
if(_charToEncode2 != (char)0 && _currentPos == 8)
_charToEncode = _charToEncode2;
_charToEncode2 = (char)0;
result = NibbleToHex(((int)_charToEncode) >> 12);
result = NibbleToHex(((int)_charToEncode) >> 8 & 0x0F);
result = NibbleToHex(((int)_charToEncode) >> 4 & 0x0F);
result = NibbleToHex(((int)_charToEncode) & 0x0F);
char NibbleToHex(int nibble)