C 如何制作字符的位掩码?

C 如何制作字符的位掩码?,c,char,C,Char,我有charvalue=“ab”,如何转换它以获得以下位掩码int mask=0xab?是否可以使int mask=0x(值)或类似的东西。

我有char
value=“ab”
,如何转换它以获得以下位掩码
int mask=0xab
?是否可以使
int mask=0x(值)
或类似的东西。

是一个多字符常量。它的具体功能是由实现定义的,因此它不会在不同的编译器中提供相同的结果。无法保证结果在任何方面都有意义。您可能想要的是:

const unsigned char *a = "ab";
现在它是一个字符串文本,您获取它的地址,并将其分配给指针。您可以这样进行拆分:

char b = a[0];
char c = a[1];
int numberyouwant = (c1 << 16) | (c2 << 8) | c3;

我想你想要这个:

#include <stdio.h>
#include <string.h>

int main() {
  char buffer[] = "ab" ;
  int x = strtol(buffer, NULL, 16);
  printf("x in hexadecimal = %x\nx in decimal = %d\n", x, x);
  return 0;
}
从您的注释中,从COM端口读取的3个字符
0 1 b8
应转换为数字
0x1b8

让我们假设:

int c1 = 0;
int c2 = 0x1;
int c3 = 0xb8;
然后,您需要的号码可以通过以下方式获得:

char b = a[0];
char c = a[1];
int numberyouwant = (c1 << 16) | (c2 << 8) | c3;

int numberyouwant=(c1您可能想要:

#include <stdio.h>
#include <string.h>

int main() {
  char buffer[] = "ab" ;
  int x = strtol(buffer, NULL, 16);
  printf("x in hexadecimal = %x\nx in decimal = %d\n", x, x);
  return 0;
}
#包括
#包括
int main(){
字符缓冲区[]=“ab”;
intx=strtol(缓冲区,NULL,16);
printf(“十六进制的x=%x\nx十进制的nx=%d\n”,x,x);
返回0;
}

或者更复杂一些,如果你只想在字符串中间选取2个字符:

#include <stdio.h>
#include <string.h>

int main() {
  char buffer[] = "ab12345" ;
  char tempbuffer[3];
  tempbuffer[0] = buffer[0];
  tempbuffer[1] = buffer[1];
  tempbuffer[2] = 0;
  int x = strtol(tempbuffer, NULL, 16);
  printf("x in hexadecimal = %x\nx in decimal = %d\n", x, x);

  return 0;
}
#包括
#包括
int main(){
字符缓冲区[]=“ab12345”;
字符缓冲区[3];
tempbuffer[0]=缓冲区[0];
tempbuffer[1]=缓冲区[1];
tempbuffer[2]=0;
intx=strtol(tempbuffer,NULL,16);
printf(“十六进制的x=%x\nx十进制的nx=%d\n”,x,x);
返回0;
}


不知何故,我觉得
a='ab'
本身并不正确是的,数据类型只存储一个字符。我看不出这个用例是如何转化为您的问题的。我的印象是,实际问题在OP之前的评论中进行了总结,并且
无符号字符a='ab'
问题一起是错误的。您有一个字节流。您是如何突然得到一个多字符文本fr的om这是一个谜。我猜行为取决于机器的终端。对我来说,打印字符
'ab'
打印
b
。是的,到C 2018 6.4.4.4 10,一个实现必须接受带有多个字符的字符常量。值是实现定义的,但不是接受它们的决定。@VladRusu:implementations可以随意定义多字符的值。它们不受机器尾数的限制。对于我在MSVC上,
'ab'
24930
,也就是
256*'a'+'b'
。看起来它是在将多字符文字解释为基数256。我想这是一种很酷的使用方法。@de>只有1个字节,而
'ab'
需要2个字节。因此,当您分配
无符号字符a='ab';
时,您将只存储
'ab'
的2个字节中的一个,这只是其中的一个字符。如果将值分配给变量,如
字符b='b8';int c=0xb;
,那么该怎么做呢?看起来您对
'b8'
是两个字符,而
0xb8
是单个字符的数值。是的,如果字符被分配给变量,如何将字符
'b8'
表示为整数
'0xb8'
,我不确定我的答案中有什么不清楚。我恐怕我们哪儿也去不了。如果你有包含
“b8”
(不是
“b8”
!)的字符流,然后您可以使用不同的方法将其转换为单个数值,包括标准库函数,如
strtoul
@БСССССССццц)。为什么不在这个答案中使用代码(只有这个答案,而不是其他答案)实际上,不要向它添加不必要的内容。还要阅读
strtol
的文档,并了解字符和字符串之间的区别。@作为来自端口的字符串。抱歉,但这是毫无意义的,因为您一直在一点一点地显示必要的信息,而这与您在问题中提出的问题无关。@ББСССцццццццццццццццц1094d当传递到
strtol
时。此时,您甚至不清楚您想要什么作为输出。@这正是我在第一个答案中回答的。至少接受它。叹气。。。