在ANSI C中,我们如何将字符串转换为二进制字节数组? 所有的谷歌搜索和搜索给了我C ++和其他人的答案,而不是C。
我的一个想法是将字符串转换为ASCII,然后将每个ASCII值转换为二进制。 (呃!)我知道这是最愚蠢的想法,但我不确定是否还有其他选择。
我听说过Java中的编码功能。我不确定这是否符合相同的目的,可以被C语言采用。
string = "Hello"
bytearr[] = 10100101... some byte array..
如果有人能对此有所了解,那就太好了。
谢谢!
答案 0 :(得分:8)
或者您的意思是如何将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;
}
示例输入&amp;输出:
./ascii2bin hello
h => 01101000
e => 01100101
l => 01101100
l => 01101100
o => 01101111
答案 1 :(得分:3)
C中没有任何字符串。任何字符串都是字节数组。
答案 2 :(得分:1)
字符串是一个字节数组。
如果你想以十六进制形式显示每个字符的ASCII值,你只需执行以下操作:
while (*str != 0)
printf("%02x ", (unsigned char) *str++);
答案 3 :(得分:1)
在我处理的大多数系统上,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]);
}
我想不出你想把这个输出转换成二进制的原因,但如果你这么想的话就可以做到。
答案 4 :(得分:0)
如果您只想迭代(或随机访问)单个字节的数值,则根本不需要进行任何转换,因为C字符串已经是数组:
void dumpbytevals(const char *str)
{
while (*str)
{
printf("%02x ", (unsigned char)*str);
str++;
}
putchar('\n');
}
但是,如果你不小心使用这种代码,当你需要支持非ASCII字符时,你可能会面临受伤的世界。
答案 5 :(得分:0)
因为转换巨大的二进制数组时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数组的指针。 Target是一个指向将包含字节数组的char数组的指针。
要将字节数组转换为十六进制字符串,您需要执行以下操作:
while (*Source != 0)
{
Target[0] = BASE16_ENCODELO(*Source);
Target[1] = BASE16_ENCODEHI(*Source);
Target += 2;
Source += 1;
}
Target是指向包含十六进制字符串的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)