微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将C字符串转换为二进制表示形式

如何解决将C字符串转换为二进制表示形式

| 在ANSI C中,如何将字符串转换为二进制字节数组? 所有的Google搜索搜索都为我提供了C ++和其他(而不是C)的答案。 我的一个想法是将字符串转换为ASCII,然后将每个ASCII值转换为其二进制。 (Du!)我知道这是最愚蠢的想法,但是我不确定是否有其他选择。 我听说过Java中的编码功能。我不确定这是否适合相同的目的并且可以被C采纳。
string = \"Hello\"
bytearr[] = 10100101... some byte array..
如果有人可以对此有所启发,那就太好了。 谢谢!     

解决方法

还是您是说如何将C字符串转换为二进制表示形式? 这是一种可以将字符串转换为二进制表示的解决方案。可以很容易地对其进行更改,以将二进制字符串保存到字符串数组中。
#include <stdio.h>

int main(int argc,char *argv[])
{
    if(argv[1] == NULL) return 0; /* no input string */

    char *ptr = argv[1];
    int i;

    for(; *ptr != 0; ++ptr)
    {
        printf(\"%c => \",*ptr);

        /* perform bitwise AND for every bit of the character */
        for(i = 7; i >= 0; --i) 
            (*ptr & 1 << i) ? putchar(\'1\') : putchar(\'0\');

        putchar(\'\\n\');
    }

    return 0;
}
输入和输出示例:
./ascii2bin hello
h => 01101000
e => 01100101
l => 01101100
l => 01101100
o => 01101111
    ,C中没有任何字符串。任何字符串都是字节数组。     ,字符串是字节数组。 如果要以十六进制形式显示每个字符的ASCII值,则只需执行以下操作:
while (*str != 0)
  printf(\"%02x \",(unsigned char) *str++);
    ,在我研究过的大多数系统上,
char
的宽度是1个字节,因此
char[]
char*
是一个字节数组。 在大多数其他语言(例如Java)中,字符串数据类型通过使用诸如UTF-8之类的编码在一定程度上照顾诸如编码之类的概念。在C中不是这种情况。如果要读取UTF-8字符串,其中的内容包括多字节值,则我的字符将由数组中的两个存储桶(或可能更多)表示。 从另一个角度来看,请考虑C中的所有类型对于您的系统都具有固定的宽度(尽管实现可能会有所不同)。 因此,您要操作的字符串是一个字节数组。 我猜接下来的问题是如何显示这些字节?这很简单:
char* x = ???; /* some string */
unsigned int xlen = strlen(x);
int i = 0;

for ( i = 0; i < xlen; i++ )
{
    printf(\"%x\",x[i]);
}
我想不出为什么要将该输出转换为二进制的原因,但是如果您这么想的话,可以这样做。     ,如果您只想迭代(或随机访问)单个字节的数字值,则根本不需要进行任何转换,因为C字符串已经是数组:
void dumpbytevals(const char *str)
{
    while (*str)
    {
        printf(\"%02x \",(unsigned char)*str);
        str++;
    }
    putchar(\'\\n\');
}
但是,如果您对这种代码不太谨慎,则当您需要支持非ASCII字符时,就有遭受伤害的危险。     ,由于在转换大型二进制数组时,printf速度很慢。这是不使用printf的另一种方法:
#define BASE16VAL               (\"x0x1x2x3x4x5x6x7x8x9|||||||xAxBxCxDxExF\") 
#define BASE16_ENCODELO(b)      (BASE16SYM[((uint8)(b)) >> 4])
#define BASE16_ENCODEHI(b)      (BASE16SYM[((uint8)(b)) & 0xF]) 
#define BASE16_DECODELO(b)      (BASE16VAL[Char_Upper(b) - \'0\'] << 4)
#define BASE16_DECODEHI(b)      (BASE16VAL[Char_Upper(b) - \'0\']). 
要将十六进制字符串转换为字节数组,请执行以下操作:
while (*Source != 0)   
    {   
    Target[0]  = BASE16_DECODELO(Souce[0]);   
    Target[0] |= BASE16_DECODEHI(Souce[1]);    

    Target += 1;   
    Source += 2;   
    } 

*Target = 0;
Source是指向包含十六进制字符串的char数组的指针。 目标是指向将包含字节数组的char数组的指针。 要将字节数组转换为十六进制字符串,请执行以下操作:
while (*Source != 0)   
    {   
    Target[0] = BASE16_ENCODELO(*Source);   
    Target[1] = BASE16_ENCODEHI(*Source);    

    Target += 2;   
    Source += 1;   
    }
目标是指向包含十六进制字符串的char数组的指针。 Source是指向将包含字节数组的char数组的指针。 以下是一些缺少的宏:
#define Char_IsLower(C)  ((uint8)(C - \'a\') < 26)
#define Char_IsUpper(C)  ((uint8)(C - \'A\') < 26)
#define Char_Upper(C)    (Char_IsLower(C) ? (C + (\'A\' - \'a\')) : C)
#define Char_Lower(C)    (Char_IsUpper(C) ? (C + (\'a\' - \'A\')) : C)
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。