简体   繁体   中英

get char out of uint64_t in c

so like title, im not sure how to get a char(in type "char", not just a byte but in the same type).For example, from a uint64_t?

I guess a type cast wont work?

Thanks a lot!

The thing is, a char in C is only one byte, and therefore can mainly represent ASCII characters. If you character is unicode, it simply cannot be converted to char . If you do want to be able to be able to store unicode characters, you should use some other type, such as wchar_t (unicode, compiler-dependant size) or char16_t (utf16 character, can still not represent some characters such as emojis and other 4-byte characters), or even char32_t .

Either way, a simple cast should work, so far as you either use ASCII or unicode.

Note: Either way, the compiler will warn you that you may lose data in the proses, as uint64_t can store more values that existing characters and therefore is larger than any character type.

So if you want to get char value if your int64_t < 255 you can try casting it first to uint8_t like this:

printf("%c", (int8_t)var);

Else if you need every char in the uint64_t you can try:

void int64ToChar(char mesg[], int64_t num) {
    for(int i = 0; i < 8; i++) mesg[i] = num >> (8-1-i)*8;
}

It depends on how the character — or characters — got into the uint64_t value in the first place.

If you say

uint64_t uu = 0x41;

then uu contains the ASCII value of a single character, and it's trivial to pull it back out. You don't even need a cast:

char c = uu;
printf("%c\n", c);      /* prints "A" */

Of course, since it's 64 bits wide, a uint64_t can theoretically have up to eight 8-bit ASCII characters jammed into it:

uu = 0x48656c6c6f;      /* "Hello" in hex */

If so, you can extract individual characters using some bit manipulation:

c = (uu >> 24) & 0xff;
printf("%c\n", c);      /* prints "e" */

Finally, since uint64_t is wider than 8 bits, it can also contain Unicode characters. For example, I could write:

uu = 0x03A3;            /* U+03A3 Greek Capital Letter Sigma */

But now there's no way to extract that as a plain char , or print it using %c . I'd have to use a wchar_t , and %lc :

wchar_t wc = uu;
printf("%lc\n", wc);    /* might print "Σ" */

Note that besides using wchar_t and %lc , this last works only if the output device is Unicode-capable, and if the "locale" is set up properly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM