首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中对ASCII的十六进制

C中对ASCII的十六进制
EN

Stack Overflow用户
提问于 2012-02-10 11:43:12
回答 2查看 16.1K关注 0票数 2

下面是我的逻辑,在C中将HEX转换为ASCII转换:

代码语言:javascript
复制
for (i=0;i<ArraySize;i++)
    {
        /*uses a bitwise AND to take the top 4 bits from the byte,
         0xF0 is 11110000 in binary*/
        char1 = Tmp[i] & 0xf0;
        char1 = char1 >> 4;
        /*bit-shift the result to the right by four bits (i.e. quickly divides by 16)*/
        if (char1 >9)
        {
            char1 = char1 - 0xa;
            char1 = char1 + 'A';
        }
        else
        char1 = char1 + '0';
        Loc[j]=char1;
        j++;
        /*means use a bitwise AND to take the bottom four bits from the byte,
        0x0F is 00001111 in binary*/
        char1 = Tmp[i] & 0x0f;
        if (char1 >9)
        {
            char1 = char1 - 0xa;
            char1 = char1 + 'A';
        }
        else
        char1 = char1 + '0';
        Loc[j]=char1;
        j++;
        Loc[j]=0;
    }

Temp和Loc是字符串缓冲区。定义并拥有数据。它没有正常工作。我正在从某个文件(示例fread)读取临时数据。它在特定的点停止读取文件。如果我先换衣服

0xf0

0x0f

下面是读取文件的方式:

代码语言:javascript
复制
BytesRead = fread (Tmp,1,Bytes,PrcFile);

然后它会读取整个文件。我找不到丢失的东西。在这方面你能帮我吗。谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-02-10 11:57:13

这不是一个答案,而是一个观察--使用它,因为它格式化了代码。

代码语言:javascript
复制
static char lookup[] = { '0', '1', '2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
int j = 0;
for (i=0; i<ArraySize; ++i)
{
   loc[j++] = lookup[(Tmp[i] & 0xf0) >> 4];
   loc[j++] = lookup[Tmp[i] & 0xf];
}
loc[j] = 0;

使代码变得更快、更简单。

票数 2
EN

Stack Overflow用户

发布于 2012-02-10 12:08:20

尽管Ed已经提供了一个较短的解决方案,但我试图找出问题所在,因为您的代码“看起来”是正确的。

让我猜猜: char1是签名的(例如,键入"char")。

然后发生了这样的情况:

文件中的一个字节(即>127 )在'A'-'F'.

  • which期间保持符号,

  • >> 4是一个有符号的移位,它使位模式保持在最重要的位

  • 中,然后比较>9 (因为符号位仍然被设置为h 29h 110),然后添加+'0',这将导致您有一个值为0的字节,而不是介于'0'-'9‘之间的字节,或者当您打印H 214f 215时,>9终止了字符串。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9227246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档