I had to write a small tool in C language to dump the metadata of the GPT partitions of an eMMC. The task is quite straightforward except that I had no idea about how to display the unicode UTF16-LE of the partition names until I discovered iconv.
iconv provides services to translate characters from one encoding to another. The list of known character set encodings is obtain with the -l option of the tool:
$ iconv -l [...] US-ASCII, US, UTF-7, UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, UTF7, UTF8, UTF16, UTF16BE, UTF16LE, UTF32, UTF32BE, UTF32LE, VISCII, WCHAR_T, WIN-SAMI-2, WINBALTRIM, WINDOWS-31J, WINDOWS-874, WINDOWS-936, WINDOWS-1250, WINDOWS-1251, WINDOWS-1252, WINDOWS-1253, WINDOWS-1254, WINDOWS-1255, WINDOWS-1256, WINDOWS-1257, WINDOWS-1258, WINSAMI2, WS2, YU |
For C language programs, iconv comes with 3 functions:
#include <errno.h> #include <stdio.h> #include <iconv.h> #include <stdlib.h> static char *gpt_utf16le2ascii(char *utf16le_str, size_t sz) { iconv_t cd; int rc; char *p; size_t sz_in, sz_out; char *str_out, *str_in; size_t conv_sz; // ASCII string is shorter than UTF16 sz_out = sz; str_out = (char *)malloc(sz_out); if (!str_out) { fprintf(stderr, "malloc(%zu): %m (%d)\n", sz, errno); return 0; } cd = iconv_open("ASCII", "UTF-16LE"); if (cd == (iconv_t)-1) { fprintf(stderr, "iconv_open(): %m (%d)\n", errno); free(str_out); return 0; } sz_in = sz; str_in = utf16le_str; p = str_out; conv_sz = iconv(cd, &utf16le_str, &sz_in, &p, &sz_out); if (conv_sz == (size_t)-1) { fprintf(stderr, "iconv(): %m (%d)\n", errno); free(str_out); iconv_close(cd); return 0; } str_out[sz-sz_out] = '\0'; rc = iconv_close(cd); if (rc == -1) { fprintf(stderr, "iconv_open(): %m (%d)\n", errno); free(str_out); return 0; } return str_out; } int main(void) { char str1[] = { 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x55, 0x00, 0x54, 0x00, 0x46, 0x00, 0x2D, 0x00, 0x31, 0x00, 0x36, 0x00, 0x4C, 0x00, 0x45, 0x00 }; char *str; str = gpt_utf16le2ascii(str1, sizeof(str1)); if (str) { printf("'%s'\n", str); free(str); } return 0; } |
Build and execution:
$ gcc example.c $ ./a.out 'ABC in UTF-16LE' |
The author is an engineer in computer sciences located in France. He can be contacted here.