In my application i have to convert long long number into 8 byte array. Then i have to convert 8 byte array into hexadecimel string. Can you please help me in this. i'm struck up.
            Asked
            
        
        
            Active
            
        
            Viewed 2,074 times
        
    1
            
            
        - 
                    so long long to hexadecimal string? – Anoop Vaidya May 31 '13 at 12:12
- 
                    See [how to get the Nth byte of an integer][1], and modify as necessary. [1]: http://stackoverflow.com/questions/7787423/c-get-nth-byte-of-integer – jarmod May 31 '13 at 12:15
- 
                    Try this format: `NSString *s = [NSString stringWithFormat:@"%08llx", llVal];` where llVal is you long long. – ott-- May 31 '13 at 12:40
2 Answers
3
            One way to do integer/byte array conversion is to use a union:
union {
    long long l;
    uint8_t b[sizeof(long long)];
} u;
u.l = mylonglong;
Then u.b[] contains the bytes, which can be accessed individually.
EDIT: Please note as pointed out by @NikolaiRuhe this use of union can lead to undefined behaviour, so it might be best to use memcpy() instead:
uint8_t b[sizeof(long long)];
memcpy(b, &mylonglong, sizeof(b));
If you want the hex string of the long long in native-endian order, then:
void hexChar(uint8_t b, char *out)
{
    static const char *chars = "0123456789abcdef";
    out[0] = chars[(b >> 4) & 0xf];
    out[1] = chars[b & 0xf];
}
// Make sure outbuf is big enough
void hexChars(const uint8_t *buffer, size_t len, char *outbuf)
{
    for (size_t i = 0; i < len; i++)
    {
        hexChar(buffer[i], outbuf);
        outbuf += 2;
    }
    *outbuf = '\0';
}
and call it with:
char hex[32];
hexChars(u.b, sizeof(u.b), hex);
However if instead you want the hex value of the long long:
char hex[32];
sprintf(hex, "%llx", mylonglong);
 
    
    
        trojanfoe
        
- 120,358
- 21
- 212
- 242
- 
                    I'm new to this. Can you please correct me if i'm doing it wrong way. union { long long l; uint8_t b[sizeof(long long)]; } u; u.l = longvalue; dataWithBytes=[NSData dataWithBytes:u.b length:sizeof(u.b)]; Then i'm converting NSData into Hex string. But i'm getting wrong result. – PremPalanisamy May 31 '13 at 12:26
- 
                    
- 
                    @PremPalanisamy How are you converting the `NSData` object into a hex string? Have you considered endian issues (i.e. iOS and OSX use little endian where the byte order is reversed)? – trojanfoe May 31 '13 at 12:29
- 
                    Using a union to write one element and then read another relies on undefined behavior. It probably works on most platforms, yet the C standard explicitly warns about this. – Nikolai Ruhe May 31 '13 at 12:30
- 
                    
- 
                    I dont have a link to the standard (I'm on a phone) but google has lots of hits for "C union undefined behavior". Here's one: http://stackoverflow.com/a/2310534/104790 – Nikolai Ruhe May 31 '13 at 12:37
- 
                    Generally in C, when converting data types bitwise it's necessary to use `memcpy`. – Nikolai Ruhe May 31 '13 at 12:40
- 
                    @NikolaiRuhe OK thanks. I will need to caveat that use of `union` then to make it obvious it can lead to undefined behaviour and I will suggest `memcpy()` instead. – trojanfoe May 31 '13 at 12:42
- 
                    char hex[32]; sprintf(hex, "%llx", mylonglong); This will do the trick. Thanks for the quick response. Anyway have to cross check with server decryption also. – PremPalanisamy May 31 '13 at 13:03
0
            
            
        would that do the trick ?
#include <stdio.h>
int main() {
    long long int val = 0x424242;
    char str_val[32];
    snprintf(str_val, sizeof(str_val), "%#llx", val);
    printf("Value : %s\n", str_val);
}
 
    
    
        DCMaxxx
        
- 2,534
- 2
- 25
- 46
- 
                    Sorry, I assumed that you just need to put it in a string. If you really need to get your 8 byte array, see trojanfoe's solution. – DCMaxxx May 31 '13 at 12:19
 
    