linux终端显示bmp图片,在Linux的终端中显示BMPString的内容

在上一篇博文中,介绍了如何在 Windows 的控制台界面下输出 BMPString 的内容,但是那里的方法在 Linux 下不适用。如果将那里的示例代码放到 Linux 下执行,输出的结果为乱码。产生乱码的原因在于 wchar_t 类型的变量在 Windows 下和 Linux 下的字节长度不同。

以下 C 程序在 Windows 和 Linux 下都能够执行:

#include #include #if defined(_WIN32) || defined(_WIN64)

#include #endif

int main(void)

{

printf("wide character (wchar_t type) length is %d bytes.\n", sizeof(wchar_t));

#if defined(_WIN32) || defined(_WIN64)

system("pause");

#endif

return 0;

}

输出结果是不同的。在 64 位 Windows 下,用微软的编译器将其分别编译成 32 位和 64 位可执行程序,输出结果证明 wchar_t 类型变量长度为 2 字节。在 64 位 Linux 下,用 64 位的 GCC 编译后执行,输出结果证明 wchar_t 类型变量长度为 4 字节。

在 Windows 下处理 BMPString 时,比如对于字符“中”,对应的 UTF-16 编码是0x4E, 0x2D,我们处理的方法是将其由 big-endian 顺序转换为 little-endian 顺序,再用 wprintf() 函数输出。

在 Linux 下处理 BMPString 时,比如对于字符“中”,对应的 UTF-16 编码是0x4E, 0x2D,我们处理的方法是将其由 2 字节长扩展到 4 字节长,扩展时新添加的两个字节的值为 0,即变为 0x0, 0x0, 0x4E, 0x2D,再由 big-endian 顺序转换为 little-endian 顺序,即编码变成 0x2D, 0x4E, 0x0, 0x0,再用 wprintf() 函数输出。

所以在 Linux 下要显示 BMPString,一般方法是先将 UTF-16 big-endian 方式的字符编码扩展为 UTF-32 big-endian 方式的字符编码,扩展方法是在前面加上两个字节的 0,再将UTF-32 big-endian 方式的字符编码变为 UTF-32 little-endian 方式的字符编码。(也可先将 UTF-16 big-endian 方式的字符编码转换为 little-endian 顺序,再给后面加上两个字节的 0,效果是一样的。)

下面给出一个示例程序:

/**************************************************

* Author: HAN Wei

* Author's blog: http://blog.csdn.net/henter/

* Date: Oct 31th, 2014

* Description: demonstrate how to print BMPString

on Linux console

**************************************************/

#include #include #include #include #include /**************************************************

*函数名称:PrintBMPStringOnLinux

*功能: 在 Linux 终端下输出 BMPString

*参数:

BMPString [in]

BMPString_len [in] BMPString 的长度,以字节为单位

*返回值:

0 成功

-1 失败

**************************************************/

int PrintBMPStringOnLinux(unsigned char *BMPString, unsigned int BMPString_len)

{

unsigned char *buffer;

unsigned int buffer_len, i;

unsigned char *p, *q;

buffer_len = BMPString_len * 2 + 4; /* 缓冲区大小为 BMPString 的字节长度的两倍

再加上四个字节,这四个字节用来存放字符串

结束符 \0(其类型为 wchar_t ),其对应

编码是 0x0, 0x0, 0x0, 0x0 */

if ( !(buffer = (unsigned char *)malloc(buffer_len)) )

{

#ifdef _DEBUG

printf("malloc() function failed!\n");

#endif

return (-1);

}

memset(buffer, 0, buffer_len);

p = buffer;

q = BMPString;

for (i=0; i < (int)BMPString_len/2; i++)

{

*p = *(q+1);

*(p+1) = *q;

p += 4;

q += 2;

}

setlocale(LC_ALL, "zh_CN.utf8");

wprintf(L"BMPString: %ls\n", (wchar_t *)buffer);

free(buffer);

return 0;

}

int main(void)

{

int error_code;

unsigned char BMPString_data1[]={0x4e, 0x2d, 0x56, 0xfd}; /* 中文字符串"中国"对应的 Unicode 编码 */

unsigned char BMPString_data2[]={0x0, 0x55, 0x0, 0x73, 0x0, 0x65, 0x0, 0x72}; /* 英文字符串"User"对应的 Unicode 编码 */

char str[]={0x2d, 0x4e, 0x0, 0x0, 0xfd, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};

if ( error_code = PrintBMPStringOnLinux(BMPString_data1, sizeof(BMPString_data1)) )

{

printf("Print BMPstring on Windows console failed!\n");

return (-1);

}

if ( error_code = PrintBMPStringOnLinux(BMPString_data2, sizeof(BMPString_data2)) )

{

printf("Print BMPstring on Windows console failed!\n");

return (-1);

}

/* 下面给出了说明 unicode 编码的字符在 Linux 中是如何存放的一个例子,

从显示结果可以看出:对于每一个用 wchar_t 类型保存的 UTF-16 字符,

长度为 4 字节,以 little-endian 顺序存放 */

printf("\n");

setlocale(LC_ALL, "zh_CN.utf8");

wprintf(L"%ls\n", (wchar_t *)str);

return 0;

}

该程序在 64 位 CentOS 下,用 64位 GCC 编译器编译后执行,输出结果如下图:

15ae766c1c9ecdefbf1b6ad18d1b37aa.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值