strToHex ( string to its hex representation as string)Integer-to-hex string generatorConvert hex string to byte arrayString representation of TreeSimple string inverter programSimple string repeater programSorting a String based on its wordsGeneric Pairing Heap PerformanceHex-string representation of a byte arrayConvert hex color string to SDL ColorConvert string of hex into vector of bytes

What is the command to reset a PC without deleting any files

Mathematical cryptic clues

How long does it take to type this?

"which" command doesn't work / path of Safari?

Why is an old chain unsafe?

The magic money tree problem

How is it possible for user to changed after storage was encrypted? (on OS X, Android)

How did the USSR manage to innovate in an environment characterized by government censorship and high bureaucracy?

Prevent a directory in /tmp from being deleted

declaring a variable twice in IIFE

Is it possible to make sharp wind that can cut stuff from afar?

Download, install and reboot computer at night if needed

How can bays and straits be determined in a procedurally generated map?

Disadvantages of online checking accounts?

Representing power series as a function - what to do with the constant after integration?

How old can references or sources in a thesis be?

Find original functions from a composite function

Is it tax fraud for an individual to declare non-taxable revenue as taxable income? (US tax laws)

The use of multiple foreign keys on same column in SQL Server

GPS Rollover on Android Smartphones

Methods for deciding between [odd number] players

A newer friend of my brother's gave him a load of baseball cards that are supposedly extremely valuable. Is this a scam?

N.B. ligature in Latex

Pronouncing Dictionary.com's W.O.D "vade mecum" in English



strToHex ( string to its hex representation as string)


Integer-to-hex string generatorConvert hex string to byte arrayString representation of TreeSimple string inverter programSimple string repeater programSorting a String based on its wordsGeneric Pairing Heap PerformanceHex-string representation of a byte arrayConvert hex color string to SDL ColorConvert string of hex into vector of bytes






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








8












$begingroup$


I want to convert strings to their hex representations as strings too (like hex dump programs), for example "abz" to "61627A".



char * strToHex( char * str )

int length = strlen ( str );
char * newStr = malloc( length * 2 );
if ( !newStr ) shutDown ( "can't alloc memory" ) ;

for ( int x = 0; x < length; x++)
char y = str[ x ];
sprintf ( newStr + x * 2, "%02X", y );

return newStr;



ShutDown definition is omitted here, it is a function that calls perror and exit()



I designed strToHex to be used like



char * str = "abcdefghijklmnopqrstuvwxyz";
char * hex = strToHex(str);
printf("%sn",hex);
//outputs : 6162636465666768696A6B6C6D6E6F707172737475767778797A









share|improve this question











$endgroup$







  • 3




    $begingroup$
    I'd be really interested to see what shutdown(char* msg) does.
    $endgroup$
    – pacmaninbw
    19 hours ago










  • $begingroup$
    In the use case that was provided, since you can effectively predict the size, I would think it would be more natural to have a string buffer and the size passed in instead of creating it dynamically.
    $endgroup$
    – Neil Edelman
    18 hours ago






  • 1




    $begingroup$
    Won't printf() require hex to have a trailing byte?
    $endgroup$
    – jochen
    12 hours ago










  • $begingroup$
    @pacmaninbw The argument name is actually "msg" as you guessed 😂 . void shutDown(char * msg) perror(msg); exit(EXIT_FAILURE);
    $endgroup$
    – Accountant م
    4 hours ago










  • $begingroup$
    @jochen Yes, thank you, I forgot to terminate newStr, and I was unlucky the couple of tests that I run didn't fail.
    $endgroup$
    – Accountant م
    4 hours ago

















8












$begingroup$


I want to convert strings to their hex representations as strings too (like hex dump programs), for example "abz" to "61627A".



char * strToHex( char * str )

int length = strlen ( str );
char * newStr = malloc( length * 2 );
if ( !newStr ) shutDown ( "can't alloc memory" ) ;

for ( int x = 0; x < length; x++)
char y = str[ x ];
sprintf ( newStr + x * 2, "%02X", y );

return newStr;



ShutDown definition is omitted here, it is a function that calls perror and exit()



I designed strToHex to be used like



char * str = "abcdefghijklmnopqrstuvwxyz";
char * hex = strToHex(str);
printf("%sn",hex);
//outputs : 6162636465666768696A6B6C6D6E6F707172737475767778797A









share|improve this question











$endgroup$







  • 3




    $begingroup$
    I'd be really interested to see what shutdown(char* msg) does.
    $endgroup$
    – pacmaninbw
    19 hours ago










  • $begingroup$
    In the use case that was provided, since you can effectively predict the size, I would think it would be more natural to have a string buffer and the size passed in instead of creating it dynamically.
    $endgroup$
    – Neil Edelman
    18 hours ago






  • 1




    $begingroup$
    Won't printf() require hex to have a trailing byte?
    $endgroup$
    – jochen
    12 hours ago










  • $begingroup$
    @pacmaninbw The argument name is actually "msg" as you guessed 😂 . void shutDown(char * msg) perror(msg); exit(EXIT_FAILURE);
    $endgroup$
    – Accountant م
    4 hours ago










  • $begingroup$
    @jochen Yes, thank you, I forgot to terminate newStr, and I was unlucky the couple of tests that I run didn't fail.
    $endgroup$
    – Accountant م
    4 hours ago













8












8








8





$begingroup$


I want to convert strings to their hex representations as strings too (like hex dump programs), for example "abz" to "61627A".



char * strToHex( char * str )

int length = strlen ( str );
char * newStr = malloc( length * 2 );
if ( !newStr ) shutDown ( "can't alloc memory" ) ;

for ( int x = 0; x < length; x++)
char y = str[ x ];
sprintf ( newStr + x * 2, "%02X", y );

return newStr;



ShutDown definition is omitted here, it is a function that calls perror and exit()



I designed strToHex to be used like



char * str = "abcdefghijklmnopqrstuvwxyz";
char * hex = strToHex(str);
printf("%sn",hex);
//outputs : 6162636465666768696A6B6C6D6E6F707172737475767778797A









share|improve this question











$endgroup$




I want to convert strings to their hex representations as strings too (like hex dump programs), for example "abz" to "61627A".



char * strToHex( char * str )

int length = strlen ( str );
char * newStr = malloc( length * 2 );
if ( !newStr ) shutDown ( "can't alloc memory" ) ;

for ( int x = 0; x < length; x++)
char y = str[ x ];
sprintf ( newStr + x * 2, "%02X", y );

return newStr;



ShutDown definition is omitted here, it is a function that calls perror and exit()



I designed strToHex to be used like



char * str = "abcdefghijklmnopqrstuvwxyz";
char * hex = strToHex(str);
printf("%sn",hex);
//outputs : 6162636465666768696A6B6C6D6E6F707172737475767778797A






beginner c strings






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 18 hours ago









mdfst13

17.9k62257




17.9k62257










asked 21 hours ago









Accountant مAccountant م

22418




22418







  • 3




    $begingroup$
    I'd be really interested to see what shutdown(char* msg) does.
    $endgroup$
    – pacmaninbw
    19 hours ago










  • $begingroup$
    In the use case that was provided, since you can effectively predict the size, I would think it would be more natural to have a string buffer and the size passed in instead of creating it dynamically.
    $endgroup$
    – Neil Edelman
    18 hours ago






  • 1




    $begingroup$
    Won't printf() require hex to have a trailing byte?
    $endgroup$
    – jochen
    12 hours ago










  • $begingroup$
    @pacmaninbw The argument name is actually "msg" as you guessed 😂 . void shutDown(char * msg) perror(msg); exit(EXIT_FAILURE);
    $endgroup$
    – Accountant م
    4 hours ago










  • $begingroup$
    @jochen Yes, thank you, I forgot to terminate newStr, and I was unlucky the couple of tests that I run didn't fail.
    $endgroup$
    – Accountant م
    4 hours ago












  • 3




    $begingroup$
    I'd be really interested to see what shutdown(char* msg) does.
    $endgroup$
    – pacmaninbw
    19 hours ago










  • $begingroup$
    In the use case that was provided, since you can effectively predict the size, I would think it would be more natural to have a string buffer and the size passed in instead of creating it dynamically.
    $endgroup$
    – Neil Edelman
    18 hours ago






  • 1




    $begingroup$
    Won't printf() require hex to have a trailing byte?
    $endgroup$
    – jochen
    12 hours ago










  • $begingroup$
    @pacmaninbw The argument name is actually "msg" as you guessed 😂 . void shutDown(char * msg) perror(msg); exit(EXIT_FAILURE);
    $endgroup$
    – Accountant م
    4 hours ago










  • $begingroup$
    @jochen Yes, thank you, I forgot to terminate newStr, and I was unlucky the couple of tests that I run didn't fail.
    $endgroup$
    – Accountant م
    4 hours ago







3




3




$begingroup$
I'd be really interested to see what shutdown(char* msg) does.
$endgroup$
– pacmaninbw
19 hours ago




$begingroup$
I'd be really interested to see what shutdown(char* msg) does.
$endgroup$
– pacmaninbw
19 hours ago












$begingroup$
In the use case that was provided, since you can effectively predict the size, I would think it would be more natural to have a string buffer and the size passed in instead of creating it dynamically.
$endgroup$
– Neil Edelman
18 hours ago




$begingroup$
In the use case that was provided, since you can effectively predict the size, I would think it would be more natural to have a string buffer and the size passed in instead of creating it dynamically.
$endgroup$
– Neil Edelman
18 hours ago




1




1




$begingroup$
Won't printf() require hex to have a trailing byte?
$endgroup$
– jochen
12 hours ago




$begingroup$
Won't printf() require hex to have a trailing byte?
$endgroup$
– jochen
12 hours ago












$begingroup$
@pacmaninbw The argument name is actually "msg" as you guessed 😂 . void shutDown(char * msg) perror(msg); exit(EXIT_FAILURE);
$endgroup$
– Accountant م
4 hours ago




$begingroup$
@pacmaninbw The argument name is actually "msg" as you guessed 😂 . void shutDown(char * msg) perror(msg); exit(EXIT_FAILURE);
$endgroup$
– Accountant م
4 hours ago












$begingroup$
@jochen Yes, thank you, I forgot to terminate newStr, and I was unlucky the couple of tests that I run didn't fail.
$endgroup$
– Accountant م
4 hours ago




$begingroup$
@jochen Yes, thank you, I forgot to terminate newStr, and I was unlucky the couple of tests that I run didn't fail.
$endgroup$
– Accountant م
4 hours ago










3 Answers
3






active

oldest

votes


















8












$begingroup$

Bug



As Carsten points out, you need to allocate $(textlengthcdot 2)+1$ bytes, rather than $(textlengthcdot2)$ to account for the null terminator sprintf() adds.



Formatting



Most C formatting guides do not include spaces around the arguments to function calls, nor the expressions within an if-statement. For an example of a C style most C programmers would find acceptable, see OpenBSD's style(9) manual.



I choose to associate * with the variable name, rather than floating between the type and name. This disambiguates the following example:



int *a, b;


Here, a is a pointer to an integer, but b is only an integer. By moving the asterisk next to the name, it makes this clearer.



int length = strlen ( str );
char * newStr = malloc (length * 2 );
if ( !newStr) shutDown ( "can't allocate memory" ) ;


Becomes:



int const len = strlen(str);
char *const new_str = malloc(1 + len * 2);

if (new_str == NULL)
shutDown("can't allocate memory");



Error checking



Rather than calling shutDown() and exit()ing the program, you should instead return an error value which can be checked by the caller of str_to_hex(). Because you return a pointer, you can return NULL to indicate an error occurred and the caller should check errno.



Likewise, on some systems your program can incorrectly exit when length == 0. If we look at the manual page for malloc(3):




Return Value



The malloc() and calloc() functions return a pointer to the allocated memory that is suitably aligned for any kind of variable. On error, these functions return NULL. NULL may also be returned by a successful call to malloc() with a size of zero, or by a successful call to calloc() with nmemb or size equal to zero.




So by returning NULL we account for the case where malloc(3) returns NULL on success.



if (new_str == NULL) 
shutDown("can't alloc memory");



Becomes:



if (new_str == NULL) 
return NULL;



If you choose, you can also check if str is NULL before calling strlen(). This is up to you, and it's not uncommon in C to ignore this case and leave it as user error.



Looping



Use the size_t type in your loop rather than int. size_t is guaranteed be wide enough to hold any array index, while int is not.



Using i rather than x is more common for looping variables.



The y variable isn't needed. You can simply use str[i] in its place.



In terms of performance there's likely a faster option than using sprintf(). You should look into strtol(3).



Conclusion



Here is the code I ended up with:



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

char *
str_to_hex(char const *const str)

size_t const len = strlen(str);

char *const new_str = malloc(1 + len * 2);

if (new_str == NULL)
return NULL;


for (size_t i = 0; i < len; ++i)
sprintf(new_str + i * 2, "%02X", str[i]);


return new_str;


int
main(void)

char *str = "abz";
char *hex = str_to_hex(str);

if (hex == NULL && strlen(str) != 0)
/* error ... */


printf("%sn",hex);

free(hex);



Hope this helps!






share|improve this answer











$endgroup$








  • 1




    $begingroup$
    Won't printf() require hex to have a trailing byte?
    $endgroup$
    – jochen
    12 hours ago






  • 3




    $begingroup$
    You should allocate 2*len+1 bytes.
    $endgroup$
    – Carsten S
    11 hours ago










  • $begingroup$
    Good advice but it fails to fix the bug in OP’s code.
    $endgroup$
    – Konrad Rudolph
    6 hours ago










  • $begingroup$
    sprintf adds a null terminator. @Carsten thanks, I forgot to include that, I'll update my answer
    $endgroup$
    – esote
    6 hours ago






  • 1




    $begingroup$
    @Accountantم It is from the OpenBSD manual, the style is called BSD kernel normal form (KNF). Around the middle of manual: "The function type should be on a line by itself preceding the function."
    $endgroup$
    – esote
    2 hours ago



















2












$begingroup$

In my opinion, the most severe problem is "Insufficient target memory".



int length = strlen ( str );
char * newStr = malloc( length * 2 );


You are allocating twice the length of str, which is enough for all the hex characters (two hex chars per input byte).



But sprintf works different: "A terminating null character is automatically appended after the content" (see here).



So the last call to sprintf will write a terminating zero byte right after newStr, into unallocated memory. This might provoke all kinds of unintended behaviour, including (but not limited to) crashes.






share|improve this answer









$endgroup$












  • $begingroup$
    Yes thank you, it's a bug. I forgot to terminate newStr, thanks for highlighting this as it's the biggest problem in my code.
    $endgroup$
    – Accountant م
    4 hours ago


















1












$begingroup$

Just one addition: like asprintf vs snprintf. One can effectively predict the size, so I would think it natural to have a string buffer and the size passed in instead of creating it dynamically.



#include <stdlib.h> /* strtol */
#include <string.h> /* strlen */
#include <stdio.h> /* printf */
#include <assert.h> /* assert */

/** Converts str to the underlying bit representation in hex, stored in
hex. It may fail to compute the entire string due to hex_size, in which
case the return will be less then the str length.
str: A valid null-terminated string.
hex: The output string.
hex_size: The output string's size.
return: The number of characters from the original that it processed. */
static size_t strToHex(const char *str, char *hex, size_t hex_size)

static const char digits[0x0F] = '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'E', 'F' ;
const size_t str_len = strlen(str), hex_len = hex_size - 1;
const size_t length = str_len < hex_len / 2 ? str_len : hex_len / 2;
const char *s = str;
char *h = hex;
size_t x;
assert(str && hex);
if(!hex_size) return 0;
for(x = 0; x < length; x++)
*h++ = digits[(*s & 0xF0) >> 4], *h++ = digits[*s++ & 0x0F];
*h = '';
return s - str;


int main(void)

const char *str = "abcdefghijklmnopqrstuvwxyz", *str2 = "æôƌԹظⓐa";
char hex[80];
size_t ret;
ret = strToHex(str, hex, sizeof hex);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str, hex, sizeof hex / 2);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str, hex, 0);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str2, hex, sizeof hex);
printf(""%s" -> "%s" (%lu.)n", str2, hex, (unsigned long)ret);
return EXIT_SUCCESS;



It cannot really fail if given the proper input, so this simplifies error checking a lot, especially in C. malloc and sprintf are pretty slow functions, comparatively, so I expect this to be faster and more robust.






share|improve this answer











$endgroup$












  • $begingroup$
    Thank you very much, I like the way you documented the function, is this a known convention for documenting C code ? I also like the performance consideration that this function has over the function I posted, but I generally give easier user interfaces more priority over performance, unless I get bottlenecks. I will study your code today again with a deeper look.
    $endgroup$
    – Accountant م
    4 hours ago











Your Answer





StackExchange.ifUsing("editor", function ()
return StackExchange.using("mathjaxEditing", function ()
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
);
);
, "mathjax-editing");

StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "196"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f216992%2fstrtohex-string-to-its-hex-representation-as-string%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























3 Answers
3






active

oldest

votes








3 Answers
3






active

oldest

votes









active

oldest

votes






active

oldest

votes









8












$begingroup$

Bug



As Carsten points out, you need to allocate $(textlengthcdot 2)+1$ bytes, rather than $(textlengthcdot2)$ to account for the null terminator sprintf() adds.



Formatting



Most C formatting guides do not include spaces around the arguments to function calls, nor the expressions within an if-statement. For an example of a C style most C programmers would find acceptable, see OpenBSD's style(9) manual.



I choose to associate * with the variable name, rather than floating between the type and name. This disambiguates the following example:



int *a, b;


Here, a is a pointer to an integer, but b is only an integer. By moving the asterisk next to the name, it makes this clearer.



int length = strlen ( str );
char * newStr = malloc (length * 2 );
if ( !newStr) shutDown ( "can't allocate memory" ) ;


Becomes:



int const len = strlen(str);
char *const new_str = malloc(1 + len * 2);

if (new_str == NULL)
shutDown("can't allocate memory");



Error checking



Rather than calling shutDown() and exit()ing the program, you should instead return an error value which can be checked by the caller of str_to_hex(). Because you return a pointer, you can return NULL to indicate an error occurred and the caller should check errno.



Likewise, on some systems your program can incorrectly exit when length == 0. If we look at the manual page for malloc(3):




Return Value



The malloc() and calloc() functions return a pointer to the allocated memory that is suitably aligned for any kind of variable. On error, these functions return NULL. NULL may also be returned by a successful call to malloc() with a size of zero, or by a successful call to calloc() with nmemb or size equal to zero.




So by returning NULL we account for the case where malloc(3) returns NULL on success.



if (new_str == NULL) 
shutDown("can't alloc memory");



Becomes:



if (new_str == NULL) 
return NULL;



If you choose, you can also check if str is NULL before calling strlen(). This is up to you, and it's not uncommon in C to ignore this case and leave it as user error.



Looping



Use the size_t type in your loop rather than int. size_t is guaranteed be wide enough to hold any array index, while int is not.



Using i rather than x is more common for looping variables.



The y variable isn't needed. You can simply use str[i] in its place.



In terms of performance there's likely a faster option than using sprintf(). You should look into strtol(3).



Conclusion



Here is the code I ended up with:



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

char *
str_to_hex(char const *const str)

size_t const len = strlen(str);

char *const new_str = malloc(1 + len * 2);

if (new_str == NULL)
return NULL;


for (size_t i = 0; i < len; ++i)
sprintf(new_str + i * 2, "%02X", str[i]);


return new_str;


int
main(void)

char *str = "abz";
char *hex = str_to_hex(str);

if (hex == NULL && strlen(str) != 0)
/* error ... */


printf("%sn",hex);

free(hex);



Hope this helps!






share|improve this answer











$endgroup$








  • 1




    $begingroup$
    Won't printf() require hex to have a trailing byte?
    $endgroup$
    – jochen
    12 hours ago






  • 3




    $begingroup$
    You should allocate 2*len+1 bytes.
    $endgroup$
    – Carsten S
    11 hours ago










  • $begingroup$
    Good advice but it fails to fix the bug in OP’s code.
    $endgroup$
    – Konrad Rudolph
    6 hours ago










  • $begingroup$
    sprintf adds a null terminator. @Carsten thanks, I forgot to include that, I'll update my answer
    $endgroup$
    – esote
    6 hours ago






  • 1




    $begingroup$
    @Accountantم It is from the OpenBSD manual, the style is called BSD kernel normal form (KNF). Around the middle of manual: "The function type should be on a line by itself preceding the function."
    $endgroup$
    – esote
    2 hours ago
















8












$begingroup$

Bug



As Carsten points out, you need to allocate $(textlengthcdot 2)+1$ bytes, rather than $(textlengthcdot2)$ to account for the null terminator sprintf() adds.



Formatting



Most C formatting guides do not include spaces around the arguments to function calls, nor the expressions within an if-statement. For an example of a C style most C programmers would find acceptable, see OpenBSD's style(9) manual.



I choose to associate * with the variable name, rather than floating between the type and name. This disambiguates the following example:



int *a, b;


Here, a is a pointer to an integer, but b is only an integer. By moving the asterisk next to the name, it makes this clearer.



int length = strlen ( str );
char * newStr = malloc (length * 2 );
if ( !newStr) shutDown ( "can't allocate memory" ) ;


Becomes:



int const len = strlen(str);
char *const new_str = malloc(1 + len * 2);

if (new_str == NULL)
shutDown("can't allocate memory");



Error checking



Rather than calling shutDown() and exit()ing the program, you should instead return an error value which can be checked by the caller of str_to_hex(). Because you return a pointer, you can return NULL to indicate an error occurred and the caller should check errno.



Likewise, on some systems your program can incorrectly exit when length == 0. If we look at the manual page for malloc(3):




Return Value



The malloc() and calloc() functions return a pointer to the allocated memory that is suitably aligned for any kind of variable. On error, these functions return NULL. NULL may also be returned by a successful call to malloc() with a size of zero, or by a successful call to calloc() with nmemb or size equal to zero.




So by returning NULL we account for the case where malloc(3) returns NULL on success.



if (new_str == NULL) 
shutDown("can't alloc memory");



Becomes:



if (new_str == NULL) 
return NULL;



If you choose, you can also check if str is NULL before calling strlen(). This is up to you, and it's not uncommon in C to ignore this case and leave it as user error.



Looping



Use the size_t type in your loop rather than int. size_t is guaranteed be wide enough to hold any array index, while int is not.



Using i rather than x is more common for looping variables.



The y variable isn't needed. You can simply use str[i] in its place.



In terms of performance there's likely a faster option than using sprintf(). You should look into strtol(3).



Conclusion



Here is the code I ended up with:



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

char *
str_to_hex(char const *const str)

size_t const len = strlen(str);

char *const new_str = malloc(1 + len * 2);

if (new_str == NULL)
return NULL;


for (size_t i = 0; i < len; ++i)
sprintf(new_str + i * 2, "%02X", str[i]);


return new_str;


int
main(void)

char *str = "abz";
char *hex = str_to_hex(str);

if (hex == NULL && strlen(str) != 0)
/* error ... */


printf("%sn",hex);

free(hex);



Hope this helps!






share|improve this answer











$endgroup$








  • 1




    $begingroup$
    Won't printf() require hex to have a trailing byte?
    $endgroup$
    – jochen
    12 hours ago






  • 3




    $begingroup$
    You should allocate 2*len+1 bytes.
    $endgroup$
    – Carsten S
    11 hours ago










  • $begingroup$
    Good advice but it fails to fix the bug in OP’s code.
    $endgroup$
    – Konrad Rudolph
    6 hours ago










  • $begingroup$
    sprintf adds a null terminator. @Carsten thanks, I forgot to include that, I'll update my answer
    $endgroup$
    – esote
    6 hours ago






  • 1




    $begingroup$
    @Accountantم It is from the OpenBSD manual, the style is called BSD kernel normal form (KNF). Around the middle of manual: "The function type should be on a line by itself preceding the function."
    $endgroup$
    – esote
    2 hours ago














8












8








8





$begingroup$

Bug



As Carsten points out, you need to allocate $(textlengthcdot 2)+1$ bytes, rather than $(textlengthcdot2)$ to account for the null terminator sprintf() adds.



Formatting



Most C formatting guides do not include spaces around the arguments to function calls, nor the expressions within an if-statement. For an example of a C style most C programmers would find acceptable, see OpenBSD's style(9) manual.



I choose to associate * with the variable name, rather than floating between the type and name. This disambiguates the following example:



int *a, b;


Here, a is a pointer to an integer, but b is only an integer. By moving the asterisk next to the name, it makes this clearer.



int length = strlen ( str );
char * newStr = malloc (length * 2 );
if ( !newStr) shutDown ( "can't allocate memory" ) ;


Becomes:



int const len = strlen(str);
char *const new_str = malloc(1 + len * 2);

if (new_str == NULL)
shutDown("can't allocate memory");



Error checking



Rather than calling shutDown() and exit()ing the program, you should instead return an error value which can be checked by the caller of str_to_hex(). Because you return a pointer, you can return NULL to indicate an error occurred and the caller should check errno.



Likewise, on some systems your program can incorrectly exit when length == 0. If we look at the manual page for malloc(3):




Return Value



The malloc() and calloc() functions return a pointer to the allocated memory that is suitably aligned for any kind of variable. On error, these functions return NULL. NULL may also be returned by a successful call to malloc() with a size of zero, or by a successful call to calloc() with nmemb or size equal to zero.




So by returning NULL we account for the case where malloc(3) returns NULL on success.



if (new_str == NULL) 
shutDown("can't alloc memory");



Becomes:



if (new_str == NULL) 
return NULL;



If you choose, you can also check if str is NULL before calling strlen(). This is up to you, and it's not uncommon in C to ignore this case and leave it as user error.



Looping



Use the size_t type in your loop rather than int. size_t is guaranteed be wide enough to hold any array index, while int is not.



Using i rather than x is more common for looping variables.



The y variable isn't needed. You can simply use str[i] in its place.



In terms of performance there's likely a faster option than using sprintf(). You should look into strtol(3).



Conclusion



Here is the code I ended up with:



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

char *
str_to_hex(char const *const str)

size_t const len = strlen(str);

char *const new_str = malloc(1 + len * 2);

if (new_str == NULL)
return NULL;


for (size_t i = 0; i < len; ++i)
sprintf(new_str + i * 2, "%02X", str[i]);


return new_str;


int
main(void)

char *str = "abz";
char *hex = str_to_hex(str);

if (hex == NULL && strlen(str) != 0)
/* error ... */


printf("%sn",hex);

free(hex);



Hope this helps!






share|improve this answer











$endgroup$



Bug



As Carsten points out, you need to allocate $(textlengthcdot 2)+1$ bytes, rather than $(textlengthcdot2)$ to account for the null terminator sprintf() adds.



Formatting



Most C formatting guides do not include spaces around the arguments to function calls, nor the expressions within an if-statement. For an example of a C style most C programmers would find acceptable, see OpenBSD's style(9) manual.



I choose to associate * with the variable name, rather than floating between the type and name. This disambiguates the following example:



int *a, b;


Here, a is a pointer to an integer, but b is only an integer. By moving the asterisk next to the name, it makes this clearer.



int length = strlen ( str );
char * newStr = malloc (length * 2 );
if ( !newStr) shutDown ( "can't allocate memory" ) ;


Becomes:



int const len = strlen(str);
char *const new_str = malloc(1 + len * 2);

if (new_str == NULL)
shutDown("can't allocate memory");



Error checking



Rather than calling shutDown() and exit()ing the program, you should instead return an error value which can be checked by the caller of str_to_hex(). Because you return a pointer, you can return NULL to indicate an error occurred and the caller should check errno.



Likewise, on some systems your program can incorrectly exit when length == 0. If we look at the manual page for malloc(3):




Return Value



The malloc() and calloc() functions return a pointer to the allocated memory that is suitably aligned for any kind of variable. On error, these functions return NULL. NULL may also be returned by a successful call to malloc() with a size of zero, or by a successful call to calloc() with nmemb or size equal to zero.




So by returning NULL we account for the case where malloc(3) returns NULL on success.



if (new_str == NULL) 
shutDown("can't alloc memory");



Becomes:



if (new_str == NULL) 
return NULL;



If you choose, you can also check if str is NULL before calling strlen(). This is up to you, and it's not uncommon in C to ignore this case and leave it as user error.



Looping



Use the size_t type in your loop rather than int. size_t is guaranteed be wide enough to hold any array index, while int is not.



Using i rather than x is more common for looping variables.



The y variable isn't needed. You can simply use str[i] in its place.



In terms of performance there's likely a faster option than using sprintf(). You should look into strtol(3).



Conclusion



Here is the code I ended up with:



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

char *
str_to_hex(char const *const str)

size_t const len = strlen(str);

char *const new_str = malloc(1 + len * 2);

if (new_str == NULL)
return NULL;


for (size_t i = 0; i < len; ++i)
sprintf(new_str + i * 2, "%02X", str[i]);


return new_str;


int
main(void)

char *str = "abz";
char *hex = str_to_hex(str);

if (hex == NULL && strlen(str) != 0)
/* error ... */


printf("%sn",hex);

free(hex);



Hope this helps!







share|improve this answer














share|improve this answer



share|improve this answer








edited 6 hours ago

























answered 19 hours ago









esoteesote

3,01311039




3,01311039







  • 1




    $begingroup$
    Won't printf() require hex to have a trailing byte?
    $endgroup$
    – jochen
    12 hours ago






  • 3




    $begingroup$
    You should allocate 2*len+1 bytes.
    $endgroup$
    – Carsten S
    11 hours ago










  • $begingroup$
    Good advice but it fails to fix the bug in OP’s code.
    $endgroup$
    – Konrad Rudolph
    6 hours ago










  • $begingroup$
    sprintf adds a null terminator. @Carsten thanks, I forgot to include that, I'll update my answer
    $endgroup$
    – esote
    6 hours ago






  • 1




    $begingroup$
    @Accountantم It is from the OpenBSD manual, the style is called BSD kernel normal form (KNF). Around the middle of manual: "The function type should be on a line by itself preceding the function."
    $endgroup$
    – esote
    2 hours ago













  • 1




    $begingroup$
    Won't printf() require hex to have a trailing byte?
    $endgroup$
    – jochen
    12 hours ago






  • 3




    $begingroup$
    You should allocate 2*len+1 bytes.
    $endgroup$
    – Carsten S
    11 hours ago










  • $begingroup$
    Good advice but it fails to fix the bug in OP’s code.
    $endgroup$
    – Konrad Rudolph
    6 hours ago










  • $begingroup$
    sprintf adds a null terminator. @Carsten thanks, I forgot to include that, I'll update my answer
    $endgroup$
    – esote
    6 hours ago






  • 1




    $begingroup$
    @Accountantم It is from the OpenBSD manual, the style is called BSD kernel normal form (KNF). Around the middle of manual: "The function type should be on a line by itself preceding the function."
    $endgroup$
    – esote
    2 hours ago








1




1




$begingroup$
Won't printf() require hex to have a trailing byte?
$endgroup$
– jochen
12 hours ago




$begingroup$
Won't printf() require hex to have a trailing byte?
$endgroup$
– jochen
12 hours ago




3




3




$begingroup$
You should allocate 2*len+1 bytes.
$endgroup$
– Carsten S
11 hours ago




$begingroup$
You should allocate 2*len+1 bytes.
$endgroup$
– Carsten S
11 hours ago












$begingroup$
Good advice but it fails to fix the bug in OP’s code.
$endgroup$
– Konrad Rudolph
6 hours ago




$begingroup$
Good advice but it fails to fix the bug in OP’s code.
$endgroup$
– Konrad Rudolph
6 hours ago












$begingroup$
sprintf adds a null terminator. @Carsten thanks, I forgot to include that, I'll update my answer
$endgroup$
– esote
6 hours ago




$begingroup$
sprintf adds a null terminator. @Carsten thanks, I forgot to include that, I'll update my answer
$endgroup$
– esote
6 hours ago




1




1




$begingroup$
@Accountantم It is from the OpenBSD manual, the style is called BSD kernel normal form (KNF). Around the middle of manual: "The function type should be on a line by itself preceding the function."
$endgroup$
– esote
2 hours ago





$begingroup$
@Accountantم It is from the OpenBSD manual, the style is called BSD kernel normal form (KNF). Around the middle of manual: "The function type should be on a line by itself preceding the function."
$endgroup$
– esote
2 hours ago














2












$begingroup$

In my opinion, the most severe problem is "Insufficient target memory".



int length = strlen ( str );
char * newStr = malloc( length * 2 );


You are allocating twice the length of str, which is enough for all the hex characters (two hex chars per input byte).



But sprintf works different: "A terminating null character is automatically appended after the content" (see here).



So the last call to sprintf will write a terminating zero byte right after newStr, into unallocated memory. This might provoke all kinds of unintended behaviour, including (but not limited to) crashes.






share|improve this answer









$endgroup$












  • $begingroup$
    Yes thank you, it's a bug. I forgot to terminate newStr, thanks for highlighting this as it's the biggest problem in my code.
    $endgroup$
    – Accountant م
    4 hours ago















2












$begingroup$

In my opinion, the most severe problem is "Insufficient target memory".



int length = strlen ( str );
char * newStr = malloc( length * 2 );


You are allocating twice the length of str, which is enough for all the hex characters (two hex chars per input byte).



But sprintf works different: "A terminating null character is automatically appended after the content" (see here).



So the last call to sprintf will write a terminating zero byte right after newStr, into unallocated memory. This might provoke all kinds of unintended behaviour, including (but not limited to) crashes.






share|improve this answer









$endgroup$












  • $begingroup$
    Yes thank you, it's a bug. I forgot to terminate newStr, thanks for highlighting this as it's the biggest problem in my code.
    $endgroup$
    – Accountant م
    4 hours ago













2












2








2





$begingroup$

In my opinion, the most severe problem is "Insufficient target memory".



int length = strlen ( str );
char * newStr = malloc( length * 2 );


You are allocating twice the length of str, which is enough for all the hex characters (two hex chars per input byte).



But sprintf works different: "A terminating null character is automatically appended after the content" (see here).



So the last call to sprintf will write a terminating zero byte right after newStr, into unallocated memory. This might provoke all kinds of unintended behaviour, including (but not limited to) crashes.






share|improve this answer









$endgroup$



In my opinion, the most severe problem is "Insufficient target memory".



int length = strlen ( str );
char * newStr = malloc( length * 2 );


You are allocating twice the length of str, which is enough for all the hex characters (two hex chars per input byte).



But sprintf works different: "A terminating null character is automatically appended after the content" (see here).



So the last call to sprintf will write a terminating zero byte right after newStr, into unallocated memory. This might provoke all kinds of unintended behaviour, including (but not limited to) crashes.







share|improve this answer












share|improve this answer



share|improve this answer










answered 6 hours ago









jvbjvb

879210




879210











  • $begingroup$
    Yes thank you, it's a bug. I forgot to terminate newStr, thanks for highlighting this as it's the biggest problem in my code.
    $endgroup$
    – Accountant م
    4 hours ago
















  • $begingroup$
    Yes thank you, it's a bug. I forgot to terminate newStr, thanks for highlighting this as it's the biggest problem in my code.
    $endgroup$
    – Accountant م
    4 hours ago















$begingroup$
Yes thank you, it's a bug. I forgot to terminate newStr, thanks for highlighting this as it's the biggest problem in my code.
$endgroup$
– Accountant م
4 hours ago




$begingroup$
Yes thank you, it's a bug. I forgot to terminate newStr, thanks for highlighting this as it's the biggest problem in my code.
$endgroup$
– Accountant م
4 hours ago











1












$begingroup$

Just one addition: like asprintf vs snprintf. One can effectively predict the size, so I would think it natural to have a string buffer and the size passed in instead of creating it dynamically.



#include <stdlib.h> /* strtol */
#include <string.h> /* strlen */
#include <stdio.h> /* printf */
#include <assert.h> /* assert */

/** Converts str to the underlying bit representation in hex, stored in
hex. It may fail to compute the entire string due to hex_size, in which
case the return will be less then the str length.
str: A valid null-terminated string.
hex: The output string.
hex_size: The output string's size.
return: The number of characters from the original that it processed. */
static size_t strToHex(const char *str, char *hex, size_t hex_size)

static const char digits[0x0F] = '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'E', 'F' ;
const size_t str_len = strlen(str), hex_len = hex_size - 1;
const size_t length = str_len < hex_len / 2 ? str_len : hex_len / 2;
const char *s = str;
char *h = hex;
size_t x;
assert(str && hex);
if(!hex_size) return 0;
for(x = 0; x < length; x++)
*h++ = digits[(*s & 0xF0) >> 4], *h++ = digits[*s++ & 0x0F];
*h = '';
return s - str;


int main(void)

const char *str = "abcdefghijklmnopqrstuvwxyz", *str2 = "æôƌԹظⓐa";
char hex[80];
size_t ret;
ret = strToHex(str, hex, sizeof hex);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str, hex, sizeof hex / 2);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str, hex, 0);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str2, hex, sizeof hex);
printf(""%s" -> "%s" (%lu.)n", str2, hex, (unsigned long)ret);
return EXIT_SUCCESS;



It cannot really fail if given the proper input, so this simplifies error checking a lot, especially in C. malloc and sprintf are pretty slow functions, comparatively, so I expect this to be faster and more robust.






share|improve this answer











$endgroup$












  • $begingroup$
    Thank you very much, I like the way you documented the function, is this a known convention for documenting C code ? I also like the performance consideration that this function has over the function I posted, but I generally give easier user interfaces more priority over performance, unless I get bottlenecks. I will study your code today again with a deeper look.
    $endgroup$
    – Accountant م
    4 hours ago















1












$begingroup$

Just one addition: like asprintf vs snprintf. One can effectively predict the size, so I would think it natural to have a string buffer and the size passed in instead of creating it dynamically.



#include <stdlib.h> /* strtol */
#include <string.h> /* strlen */
#include <stdio.h> /* printf */
#include <assert.h> /* assert */

/** Converts str to the underlying bit representation in hex, stored in
hex. It may fail to compute the entire string due to hex_size, in which
case the return will be less then the str length.
str: A valid null-terminated string.
hex: The output string.
hex_size: The output string's size.
return: The number of characters from the original that it processed. */
static size_t strToHex(const char *str, char *hex, size_t hex_size)

static const char digits[0x0F] = '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'E', 'F' ;
const size_t str_len = strlen(str), hex_len = hex_size - 1;
const size_t length = str_len < hex_len / 2 ? str_len : hex_len / 2;
const char *s = str;
char *h = hex;
size_t x;
assert(str && hex);
if(!hex_size) return 0;
for(x = 0; x < length; x++)
*h++ = digits[(*s & 0xF0) >> 4], *h++ = digits[*s++ & 0x0F];
*h = '';
return s - str;


int main(void)

const char *str = "abcdefghijklmnopqrstuvwxyz", *str2 = "æôƌԹظⓐa";
char hex[80];
size_t ret;
ret = strToHex(str, hex, sizeof hex);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str, hex, sizeof hex / 2);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str, hex, 0);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str2, hex, sizeof hex);
printf(""%s" -> "%s" (%lu.)n", str2, hex, (unsigned long)ret);
return EXIT_SUCCESS;



It cannot really fail if given the proper input, so this simplifies error checking a lot, especially in C. malloc and sprintf are pretty slow functions, comparatively, so I expect this to be faster and more robust.






share|improve this answer











$endgroup$












  • $begingroup$
    Thank you very much, I like the way you documented the function, is this a known convention for documenting C code ? I also like the performance consideration that this function has over the function I posted, but I generally give easier user interfaces more priority over performance, unless I get bottlenecks. I will study your code today again with a deeper look.
    $endgroup$
    – Accountant م
    4 hours ago













1












1








1





$begingroup$

Just one addition: like asprintf vs snprintf. One can effectively predict the size, so I would think it natural to have a string buffer and the size passed in instead of creating it dynamically.



#include <stdlib.h> /* strtol */
#include <string.h> /* strlen */
#include <stdio.h> /* printf */
#include <assert.h> /* assert */

/** Converts str to the underlying bit representation in hex, stored in
hex. It may fail to compute the entire string due to hex_size, in which
case the return will be less then the str length.
str: A valid null-terminated string.
hex: The output string.
hex_size: The output string's size.
return: The number of characters from the original that it processed. */
static size_t strToHex(const char *str, char *hex, size_t hex_size)

static const char digits[0x0F] = '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'E', 'F' ;
const size_t str_len = strlen(str), hex_len = hex_size - 1;
const size_t length = str_len < hex_len / 2 ? str_len : hex_len / 2;
const char *s = str;
char *h = hex;
size_t x;
assert(str && hex);
if(!hex_size) return 0;
for(x = 0; x < length; x++)
*h++ = digits[(*s & 0xF0) >> 4], *h++ = digits[*s++ & 0x0F];
*h = '';
return s - str;


int main(void)

const char *str = "abcdefghijklmnopqrstuvwxyz", *str2 = "æôƌԹظⓐa";
char hex[80];
size_t ret;
ret = strToHex(str, hex, sizeof hex);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str, hex, sizeof hex / 2);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str, hex, 0);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str2, hex, sizeof hex);
printf(""%s" -> "%s" (%lu.)n", str2, hex, (unsigned long)ret);
return EXIT_SUCCESS;



It cannot really fail if given the proper input, so this simplifies error checking a lot, especially in C. malloc and sprintf are pretty slow functions, comparatively, so I expect this to be faster and more robust.






share|improve this answer











$endgroup$



Just one addition: like asprintf vs snprintf. One can effectively predict the size, so I would think it natural to have a string buffer and the size passed in instead of creating it dynamically.



#include <stdlib.h> /* strtol */
#include <string.h> /* strlen */
#include <stdio.h> /* printf */
#include <assert.h> /* assert */

/** Converts str to the underlying bit representation in hex, stored in
hex. It may fail to compute the entire string due to hex_size, in which
case the return will be less then the str length.
str: A valid null-terminated string.
hex: The output string.
hex_size: The output string's size.
return: The number of characters from the original that it processed. */
static size_t strToHex(const char *str, char *hex, size_t hex_size)

static const char digits[0x0F] = '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'E', 'F' ;
const size_t str_len = strlen(str), hex_len = hex_size - 1;
const size_t length = str_len < hex_len / 2 ? str_len : hex_len / 2;
const char *s = str;
char *h = hex;
size_t x;
assert(str && hex);
if(!hex_size) return 0;
for(x = 0; x < length; x++)
*h++ = digits[(*s & 0xF0) >> 4], *h++ = digits[*s++ & 0x0F];
*h = '';
return s - str;


int main(void)

const char *str = "abcdefghijklmnopqrstuvwxyz", *str2 = "æôƌԹظⓐa";
char hex[80];
size_t ret;
ret = strToHex(str, hex, sizeof hex);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str, hex, sizeof hex / 2);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str, hex, 0);
printf(""%s" -> "%s" (%lu.)n", str, hex, (unsigned long)ret);
ret = strToHex(str2, hex, sizeof hex);
printf(""%s" -> "%s" (%lu.)n", str2, hex, (unsigned long)ret);
return EXIT_SUCCESS;



It cannot really fail if given the proper input, so this simplifies error checking a lot, especially in C. malloc and sprintf are pretty slow functions, comparatively, so I expect this to be faster and more robust.







share|improve this answer














share|improve this answer



share|improve this answer








edited 16 hours ago

























answered 17 hours ago









Neil EdelmanNeil Edelman

317110




317110











  • $begingroup$
    Thank you very much, I like the way you documented the function, is this a known convention for documenting C code ? I also like the performance consideration that this function has over the function I posted, but I generally give easier user interfaces more priority over performance, unless I get bottlenecks. I will study your code today again with a deeper look.
    $endgroup$
    – Accountant م
    4 hours ago
















  • $begingroup$
    Thank you very much, I like the way you documented the function, is this a known convention for documenting C code ? I also like the performance consideration that this function has over the function I posted, but I generally give easier user interfaces more priority over performance, unless I get bottlenecks. I will study your code today again with a deeper look.
    $endgroup$
    – Accountant م
    4 hours ago















$begingroup$
Thank you very much, I like the way you documented the function, is this a known convention for documenting C code ? I also like the performance consideration that this function has over the function I posted, but I generally give easier user interfaces more priority over performance, unless I get bottlenecks. I will study your code today again with a deeper look.
$endgroup$
– Accountant م
4 hours ago




$begingroup$
Thank you very much, I like the way you documented the function, is this a known convention for documenting C code ? I also like the performance consideration that this function has over the function I posted, but I generally give easier user interfaces more priority over performance, unless I get bottlenecks. I will study your code today again with a deeper look.
$endgroup$
– Accountant م
4 hours ago

















draft saved

draft discarded
















































Thanks for contributing an answer to Code Review Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

Use MathJax to format equations. MathJax reference.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f216992%2fstrtohex-string-to-its-hex-representation-as-string%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Reverse int within the 32-bit signed integer range: [−2^31, 2^31 − 1]Combining two 32-bit integers into one 64-bit integerDetermine if an int is within rangeLossy packing 32 bit integer to 16 bitComputing the square root of a 64-bit integerKeeping integer addition within boundsSafe multiplication of two 64-bit signed integersLeetcode 10: Regular Expression MatchingSigned integer-to-ascii x86_64 assembler macroReverse the digits of an Integer“Add two numbers given in reverse order from a linked list”

Category:Fedor von Bock Media in category "Fedor von Bock"Navigation menuUpload mediaISNI: 0000 0000 5511 3417VIAF ID: 24712551GND ID: 119294796Library of Congress authority ID: n96068363BnF ID: 12534305fSUDOC authorities ID: 034604189Open Library ID: OL338253ANKCR AUT ID: jn19990000869National Library of Israel ID: 000514068National Thesaurus for Author Names ID: 341574317ReasonatorScholiaStatistics

Kiel Indholdsfortegnelse Historie | Transport og færgeforbindelser | Sejlsport og anden sport | Kultur | Kendte personer fra Kiel | Noter | Litteratur | Eksterne henvisninger | Navigationsmenuwww.kiel.de54°19′31″N 10°8′26″Ø / 54.32528°N 10.14056°Ø / 54.32528; 10.14056Oberbürgermeister Dr. Ulf Kämpferwww.statistik-nord.deDen danske Stats StatistikKiels hjemmesiderrrWorldCat312794080n790547494030481-4