将raw数据转换为字符串的C++/Win32例程
acmilan2015/11/17软件综合 IP:四川
将指定长度cb的raw数据转换为字符串,用replchr替换掉异常的0字符(默认为空格),末尾加上0字符以终止字符串。可指定吃掉eatcch个前导字符(主要用于吃掉BOM)。

MakeTextA用于ANSI/UTF-8数据,将它变换为窄字符串,最后一个参数保留。

MakeTextW用于UTF-16LE/BE数据,变换为宽字符串,最后一个参数为TRUE翻转字节序。将会忽略多余的奇数字节。
<code class="lang-cpp">#include <windows.h>
   
LPWSTR MakeTextW(LPVOID buf, INT_PTR cb, INT_PTR eatcch = 0, WCHAR replchr = L' ', BOOL reversed = FALSE)
{
    LPWSTR str = (LPWSTR)buf;
    INT_PTR cch = cb / sizeof (WCHAR);
    for (int j = 0; j < cch - eatcch; j++)
    {
        WCHAR chr = str[j + eatcch];
        if (reversed) chr = ((USHORT)chr >> 8) | ((USHORT)chr << 8);
        if (chr == 0) chr = replchr;
        str[j] = chr;
    }
    str[cch - eatcch] = 0;
    return str;
}
   
LPSTR MakeTextA(LPVOID buf, INT_PTR cb, INT_PTR eatcch = 0, CHAR replchr = ' ', BOOL reversed = FALSE)
{
    LPSTR str = (LPSTR)buf;
    INT_PTR cch = cb / sizeof(CHAR);
    for (int j = 0; j < cch - eatcch; j++)
    {
        CHAR chr = str[j + eatcch];
        if (chr == 0) chr = replchr;
        str[j] = chr;
    }
    str[cch - eatcch] = 0;
    return str;
}
   
   
int main()
{
    HANDLE hin = GetStdHandle(STD_INPUT_HANDLE);
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD count = 0;
   
    WCHAR buf[200] = L"3374\0" L"\u3500\u3700\u3500\u3800整周周\0" L"222";
    CHAR bufa[200] = "3374\0" "5758整周周\0" "222";
       
    // 31 字节 = 15 WCHARs + 1 奇数字节(忽略),开头吃一个字符,0替换为空格(默认),不转换字节序(默认)
    MakeTextW(buf, 31, 1); 
    //MakeTextW(buf, 31, 1, 0x20, TRUE); 
    WriteConsoleW(hout, buf, lstrlenW(buf), &count, NULL);
    WriteConsoleW(hout, L"\n", 1, &count, NULL);
   
    MakeTextA(bufa, 18, 1);
    WriteConsoleA(hout, bufa, lstrlenA(bufa), &count, NULL);
    WriteConsoleA(hout, "\n", 1, &count, NULL);
   
    return 0;
}</windows.h></code>

[修改于 8年7个月前 - 2015/11/17 18:13:29]

来自:计算机科学 / 软件综合
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
acmilan 作者
8年7个月前 IP:四川
797478
这两个函数对于读取文本文件非常有用。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年4个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}