PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Thursday, August 11, 2022

[FIXED] How to convert the template from C++ to C

 August 11, 2022     c, c++, decimal, hex, templates     No comments   

Issue

I am trying to convert some C++ code to C for my compiler that can't run with C++ code. I'd like to create the template below to C. This template converts the decimal integer to hexadecimal, and adds 0 in front of value if the size of the hexadecimal string is smaller than (sizeof(T)*2). Data type T can be unsigned char, char, short, unsigned short, int, unsigned int, long long, and unsigned long long.

template< typename T > std::string hexify(T i)
{
    std::stringbuf buf;
    std::ostream os(&buf);
    os << std::setfill('0') << std::setw(sizeof(T) * 2)
       << std::hex << i;
    std::cout<<"sizeof(T) * 2 = "<<sizeof(T) * 2<<"   buf.str() = "<<buf.str()<<"   buf.str.c_str() = "<<buf.str().c_str()<<std::endl;
    return buf.str().c_str();
}

Thank you for tour help.

Edit 1: I have tried to use the declaration

char * hexify (void data, size_t data_size)

but when I call with the int value int_value:

char * result = hexify(int_value, sizeof(int)) 

it doesn't work because of:

noncompetitive type (void and int).

So in this case, do I have to use a macro? I haven't tried with macro because it's complicated.


Solution

C does not have templates. One solution is to pass the maximum width integer supported (uintmax_t, in Value below) and the size of the original integer (in Size). One routine can use the size to determine the number of digits to print. Another complication is C does not provide C++’s std::string with is automatic memory management. A typical way to handle this in C is for the called function to allocate a buffer and return it to the caller, who is responsible for freeing it when done.

The code below shows a hexify function that does this, and it also shows a Hexify macro that takes a single parameter and passes both its size and its value to the hexify function.

Note that, in C, character constants such as 'A' have type int, not char, so some care is needed in providing the desired size. The code below includes an example for that.

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>


char *hexify(size_t Size, uintmax_t Value)
{
    //  Allocate space for "0x", 2*Size digits, and a null character.
    size_t BufferSize = 2 + 2*Size + 1;
    char *Buffer = malloc(BufferSize);

    //  Ensure a buffer was allocated.
    if (!Buffer)
    {
        fprintf(stderr,
            "Error, unable to allocate buffer of %zu bytes in %s.\n",
            BufferSize, __func__);
        exit(EXIT_FAILURE);
    }

    //  Format the value as "0x" followed by 2*Size hexadecimal digits.
    snprintf(Buffer, BufferSize, "0x%0*" PRIxMAX, (int) (2*Size), Value);

    return Buffer;
}


/*  Provide a macro that passes both the size and the value of its parameter
    to the hexify function.
*/
#define Hexify(x)   (hexify(sizeof (x), (x)))


int main(void)
{
    char *Buffer;

    /*  Show two examples of using the hexify function with different integer
        types.  (The examples assume ASCII.)
    */

    char x = 'A';
    Buffer = hexify(sizeof x, x);
    printf("Character '%c' = %s.\n", x, Buffer);  // Prints "0x41".
    free(Buffer);

    int i = 123;
    Buffer = hexify(sizeof i, i);
    printf("Integer %d = %s.\n", i, Buffer);  // Prints "0x00007b".
    free(Buffer);

    /*  Show examples of using the Hexify macro, demonstrating that 'A' is an
        int value, not a char value, so it would need to be cast if a char is
        desired.
    */
    Buffer = Hexify('A');
    printf("Character '%c' = %s.\n", 'A', Buffer);  // Prints "0x00000041".
    free(Buffer);

    Buffer = Hexify((char) 'A');
    printf("Character '%c' = %s.\n", 'A', Buffer);  // Prints "0x41".
    free(Buffer);
}


Answered By - Eric Postpischil
Answer Checked By - Marilyn (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing