8

I'm trying to convert a byte array to a string in C but I can't quite figure it out.

I have an example of what works for me in C++ but I need to convert it to C.

The C++ code is below:

#include <iostream>
#include <string>

typedef unsigned char BYTE;

int main(int argc, char *argv[])
{
  BYTE byteArray[5] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F };
  std::string s(reinterpret_cast<char*>(byteArray), sizeof(byteArray));
  std::cout << s << std::endl;

  return EXIT_SUCCESS;
}

Can anyone point me in the right direction?

14
  • 4
    String is a byte array with terminating '\0' character. So yeah, you will need it's size to accommodate it too. Commented Aug 7, 2019 at 17:02
  • Aren't you missing a null-terminator? Commented Aug 7, 2019 at 17:06
  • 3
    @LeeDanielCrocker Please actually read the question, not just the code. OP has C++ code; but they want to know how to do the same in C. Commented Aug 7, 2019 at 17:10
  • 2
    @Konrad OK, sorry for the mess. I misread. Commented Aug 7, 2019 at 17:11
  • 1
    I'll add both tags. Anyone disagreeing kindly take it up on meta here instead of vandalizing this question with edits. Commented Aug 7, 2019 at 17:29

3 Answers 3

19

Strings in C are byte arrays which are zero-terminated. So all you need to do is copy the array into a new buffer with sufficient space for a trailing zero byte:

#include <string.h>
#include <stdio.h>

typedef unsigned char BYTE;

int main() {
    BYTE byteArray[5] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F };
    char str[(sizeof byteArray) + 1];
    memcpy(str, byteArray, sizeof byteArray);
    str[sizeof byteArray] = 0; // Null termination.
    printf("%s\n", str);
}
Sign up to request clarification or add additional context in comments.

3 Comments

@πάνταῥεῖ every changes my tags for the OP. The first line states the code IS in C++ but I want it in C. This works a treat and will accept when able
@tadman That’s an unfair accusation. The tags say C, the title says C, the body of the question says C. We (me included!) are just all jumping at the sight of C++ code and ignore mentions of C in tags and title like Pavlovian dogs (because we’ve been conditioned to expect mis-tagging between the two languages) but the question makes it clear why the C++ code is included, and how it’s relevant and legitimate.
@KonradRudolph There is C++ code present which is a red herring, and that's really not called for. I'm of the opinion that if there's C++ code in the question, it is, by definition, a C++ question and should be tagged as such. If you want C and C only, don't even go there, just use C and deal.
2

C strings are null terminated, so the size of the string will be the size of the array plus one, for the null terminator. Then you could use memcpy() to copy the string, like this:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned char BYTE;

int main(void)
{
  BYTE byteArray[5] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F };

  // +1 for the NULL terminator
  char str[sizeof(byteArray) + 1];
  // Copy contents
  memcpy(str, byteArray, sizeof(byteArray));
  // Append NULL terminator
  str[sizeof(byteArray)] = '\0';

  printf("%s\n", str);    
  return EXIT_SUCCESS;
}

Output:

Hello

Run it online

3 Comments

You're missing the '\0'.
It looks slow. Why clear the entire buffer before a copy? Also strcpy() is incorrect since the source is not null terminated.
@AlexisWilke right, I could just memcpy(), which doesn't need a cast also. No need to clear indeed, I could just append the NULL terminator, right?
0

Here is a demonstrative program that shows how it can be done.

#include <stdio.h>
#include <string.h>

typedef unsigned char BYTE;

int main(void) 
{
    BYTE byteArray[5] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F };
    char s[sizeof( byteArray ) + sizeof( ( char )'\0' )] = { '\0' };

    memcpy( s, byteArray, sizeof( byteArray ) );

    puts( s );

    return 0;
}

The program output is

Hello

Pay attention to that the character array is zero initialized. Otherwise after the call of memcpy you have to append the terminating zero "manually".

s[sizeof( s ) - 1] = '\0';

or

s[sizeof( byteArray )] = '\0';

The last variant should be used when the size of the character array much greater than the size of byteArray.

4 Comments

Only if the string is really large the .. = { '\0' } is going to be a real waste.
@AlexisWilke So as I said the terminating zero can be appended manually.:)
@gsamaras No I need not. But this variant is already shown in my answer.:)
I thought you meant s as the byteArray, which would be wrong, now it's fine, misread that, συγγνώμη! :)

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.