user-0 提问: 一个c语言的小问题，请教高手。。。

回复:
user: user-1
content: 引用 16 楼 pz239 的回复:赵老师的方法已经超出了我的理解能力了，有没有简单点的方法。。，我自己想了个笨办法，如下。，不知是否正确。。  在B不大的情况下： unsigned long value = 0; p = p + B; for (i = 0; i < B; i++)     value =  *(unsigned char *)p-- * (256的i次方）  可以的。  unsigned char* p = ...; unsigned long long v = 0; for(size_t i = 0; i < B;  ++i){    v <<= 8;    v += *p; }  或者  unsigned char* p = ...; unsigned long long v = 0;  for(int  i = B-1; i >=  0;  --i){    v <<= 8;    v += p[i]; }

user: user-2
content: 我想这样应该可以，在x86上不考虑bus error。  unsigned int *q = p;   //(p为char *) cnt = B / sizeof(unsigned int); int i;  for(i = 0;i < cnt;i++) {         printf("%u\n",*q);         q++; }  p = q; int rest = B - cnt*szieof(unsigned int); switch(rest) {       case 1:               printf("%u\n",(unsigned int)*p);break;        case 2:              printf("%u\n",(unsigned int)(*p | (*(p+1) << 8));break;//小端模式下       case 3:               printf("%u\n",(unsigned int)(*p | (*(p+1) << 8) | (*(p+2) << 16));break;       default:             break; }

user: user-0
content: 赵老师的方法已经超出了我的理解能力了，有没有简单点的方法。。，我自己想了个笨办法，如下。，不知是否正确。。  在B不大的情况下： unsigned long value = 0; p = p + B; for (i = 0; i < B; i++)     value =  *(unsigned char *)p-- * (256的i次方）

user: user-3
content: 仅供参考#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-4
content: B的长度有个范围吧，大于8就不能用long或者long long表示啦

user: user-0
content: B不是个确定值，所以B个字节的内存空间不一定对应有特定的类型的长度（比如int要求B是4），所以不能用将这块内存空间看做是某种特定类型来提取其值。。  说白了就是给定了一片内存空间，起始位置是p，长度是B（B不是很大），想把这块内存空间中的二进制位转换成一个大整数。。

user: user-2
content: 引用 11 楼 mymtom 的回复:[quote=引用 6 楼 cyd54454 的回复:] 这个B是多少啊？你把p强制转换成(unsigned int *)，然后取值，就是这样。因为对于二进制来说哪有什么无符号有符号啊，看你想怎么去解释这些二进制而已。你用int *指针去取，它把最高位解释成符号位以此确定正负；你用unsigned int *指针去取，它就不会把最高位解释成符号位而是当做数据位。 最好不要真么做，char *p强制转换成(unsgined int *)再取值 u = *((unsgined int *)p);  在某些系统上会出现BUS ERROR的。[/quote] 好吧，的确有疏忽，没去考虑地址未对齐的读写。因为从来没遇到过....

user: user-4
content: 引用 6 楼 cyd54454 的回复:这个B是多少啊？你把p强制转换成(unsigned int *)，然后取值，就是这样。因为对于二进制来说哪有什么无符号有符号啊，看你想怎么去解释这些二进制而已。你用int *指针去取，它把最高位解释成符号位以此确定正负；你用unsigned int *指针去取，它就不会把最高位解释成符号位而是当做数据位。 最好不要真么做，char *p强制转换成(unsgined int *)再取值 u = *((unsgined int *)p);  在某些系统上会出现BUS ERROR的。

user: user-2
content: 引用 8 楼 pz239 的回复:B是个变量。。，我想把这些二进制换算成一个无符号整数，这个无符号整数要能用p和B表示出来。。 什么类型的变量？能说下基于什么情况要把B转换成一个无符号数么？在什么都不知道的时候，我只能说强制转换呗。

user: user-0
content: 再次重申一次，01不是字符，而是内存本身的二进制位。。

user: user-0
content: B是个变量。。，我想把这些二进制换算成一个无符号整数，这个无符号整数要能用p和B表示出来。。

user: user-4
content: 是字符串吗， 用strtoul啊  #include <stddef.h> #include <stdio.h> #include <stdlib.h>  int main(int argc, char *argv[]) {     unsigned int u;     char s1[] =         "0000" "0001" "0010" "0011"         "0100" "0101" "0110" "0111";      char s2[] =         "1000" "1001" "1010" "1011"         "1100" "1101" "1110" "1111";      u = strtoul(s1, NULL, 2);     printf("%08x\n", u);      u = strtoul(s2, NULL, 2);     printf("%08x\n", u);      return 0; }

user: user-2
content: 这个B是多少啊？你把p强制转换成(unsigned int *)，然后取值，就是这样。因为对于二进制来说哪有什么无符号有符号啊，看你想怎么去解释这些二进制而已。你用int *指针去取，它把最高位解释成符号位以此确定正负；你用unsigned int *指针去取，它就不会把最高位解释成符号位而是当做数据位。

user: user-0
content: [quote=引用 2 楼 starytx 的回复:] 你说的这个01串是字符串形式吗？是的话需要一个字符一个字符的进行计算[/quote 01串指的是这B个字节本身所包含的二进制位，要求计算速度越快越好，就是用c本身实现，不涉及它语言。。

user: user-0
content: 01串指的是这B个字节本身所包含的二进制位。。

user: user-5
content: 引用 2 楼 starytx 的回复:你说的这个01串是字符串形式吗？是的话需要一个字符一个字符的进行计算 要用ASCII来判断吗？ c#直接int.Parse(string)就好了。。。

user: user-6
content: 你说的这个01串是字符串形式吗？是的话需要一个字符一个字符的进行计算

user: user-7
content: 二进制与十进制之间的转化