17

Suppose I have this string

string str = "1234"

I need a function that convert this string to this string:

"0x31 0x32 0x33 0x34"  

I searched online and found a lot of similar things, but not an answer to this question.

4
  • Can you provide a second example? Commented Apr 10, 2013 at 8:32
  • 1
    Possible duplicate: str.ToString("X"); Commented Apr 10, 2013 at 8:32
  • BTW, your example is not ASCII, .NET strings are Unicode (UTF-16). Commented Apr 10, 2013 at 8:35
  • 1
    @vanneto: That won't work. string has no overload of ToString that takes a parameter of type string. Commented Apr 10, 2013 at 8:36

7 Answers 7

19
string str = "1234";
char[] charValues = str.ToCharArray();
string hexOutput="";
foreach (char _eachChar in charValues )
{
    // Get the integral value of the character.
    int value = Convert.ToInt32(_eachChar);
    // Convert the decimal value to a hexadecimal value in string form.
    hexOutput += String.Format("{0:X}", value);
    // to make output as your eg 
    //  hexOutput +=" "+ String.Format("{0:X}", value);

}

    //here is the HEX hexOutput 
    //use hexOutput 
Sign up to request clarification or add additional context in comments.

1 Comment

Note that this uses string concatenation, which might or might not be a performance problem depending on the size of str.
12

This seems the job for an extension method

void Main()
{
    string test = "ABCD1234";
    string result = test.ToHex();
}

public static class StringExtensions
{
    public static string ToHex(this string input)
    {
        StringBuilder sb = new StringBuilder();
        foreach(char c in input)
            sb.AppendFormat("0x{0:X2} ", (int)c);
        return sb.ToString().Trim();
    }
}

A few tips.
Do not use string concatenation. Strings are immutable and thus every time you concatenate a string a new one is created. (Pressure on memory usage and fragmentation) A StringBuilder is generally more efficient for this case.

Strings are array of characters and using a foreach on a string already gives access to the character array

These common codes are well suited for an extension method included in a utility library always available for your projects (code reuse)

Comments

3

Convert to byte array and then to hex

        string data = "1234";

        // Convert to byte array
        byte[] retval = System.Text.Encoding.ASCII.GetBytes(data);

        // Convert to hex and add "0x"
        data =  "0x" + BitConverter.ToString(retval).Replace("-", " 0x");

        System.Diagnostics.Debug.WriteLine(data);

Comments

2
static void Main(string[] args)
{
    string str = "1234";
    char[] array = str.ToCharArray();
    string final = "";
    foreach (var i in array)
    {
        string hex = String.Format("{0:X}", Convert.ToInt32(i));
        final += hex.Insert(0, "0X") + " ";       
    }
    final = final.TrimEnd();
    Console.WriteLine(final);
}

Output will be;

0X31 0X32 0X33 0X34

Here is a DEMO.

Comments

2

A nice declarative way to solve this would be:

var str = "1234"

string.Join(" ", str.Select(c => $"0x{(int)c:X}"))

// Outputs "0x31 0x32 0x33 0x34"

Comments

1
 [TestMethod]
    public void ToHex()
    {
        string str = "1234A";
        var result = str.Select(s =>  string.Format("0x{0:X2}", ((byte)s)));

       foreach (var item in result)
       {
           Debug.WriteLine(item);
       }

    }

3 Comments

That outputs 0x1, 0x2, 0x3, 0x4. Not what the OP wants.
You should delete the first, incorrect version. And you should fix the second one. It produces the correct output, but the format should look like this: string.Format("0x{0:X2}", (int)s). Reasons: (1) X8 is never used, because the value used for this parameter is a string. (2) A char can contain values that exceed the range of a byte.
I just desired to show string.Format and ToString() together. I supposed chars in ASCII. byte is enough for ascii AFAIK. thanks.
0

This is one I've used:

private static string ConvertToHex(byte[] bytes)
        {
            var builder = new StringBuilder();

            var hexCharacters = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

            for (var i = 0; i < bytes.Length; i++)
            {
                int firstValue = (bytes[i] >> 4) & 0x0F;
                int secondValue = bytes[i] & 0x0F;

                char firstCharacter = hexCharacters[firstValue];
                char secondCharacter = hexCharacters[secondValue];

                builder.Append("0x");
                builder.Append(firstCharacter);
                builder.Append(secondCharacter);
                builder.Append(' ');
            }

            return builder.ToString().Trim(' ');
        }

And then used like:

string test = "1234";
ConvertToHex(Encoding.UTF8.GetBytes(test));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.