c/c++语言开发共享使用printf以hex格式打印字符串,结果失真

我想以hex格式打印字符串,

在机器A上,类似于

ori_mesg = gen_rdm_bytestream (1400,seed) sendto(machine B, ori_mesg, len(mesg)) 

在机器B上

  recvfrom(machine A, mesg) mesg_check = gen_rdm_bytestream (1400, seed) for(i=0;i<20;i++){ printf("%02x ", *(mesg+i)& 0xFF); } printf("n"); for(i=0;i<20;i++){ printf("%02x ", *(mesg_check+i)); } printf("n"); 

seed在1,2,3之间变化….

字节生成函数是:

 u_char *gen_rdm_bytestream (size_t num_bytes, unsigned int seed) { u_char *stream = malloc (num_bytes+4); size_t i; u_int16_t seq = seed; seq = htons(seq); u_int16_t tail = num_bytes; tail = htons(tail); memcpy(stream, &seq, sizeof(seq)); srand(seed); for (i = 3; i < num_bytes+2; i++){ stream[i] = rand (); } memcpy(stream+num_bytes+2, &tail, sizeof(tail)); return stream; } 

但是我得到了printf的结果:

 00 01 00 67 c6 69 73 51 ff 4a ec 29 cd ba ab f2 fb e3 46 7c 00 01 00 67 ffffffc6 69 73 51 ffffffff 4a ffffffec 29 ffffffcd ffffffba ffffffab fffffff2 fffffffb ffffffe3 46 7c 

要么

 00 02 88 fa 7f 44 4f d5 d2 00 2d 29 4b 96 c3 4d c5 7d 29 7e 00 02 00 fffffffa 7f 44 4f ffffffd5 ffffffd2 00 2d 29 4b ffffff96 ffffffc3 4d ffffffc5 7d 29 7e 

为什么mesg_check有这么多的fffff

这种现象有什么潜在的原因吗? 谢谢!

    这是一个小程序,说明了我认为你可能遇到的问题:

     #include  int main(void) { char arr[] = { 0, 16, 127, 128, 255 }; for (int i = 0; i < sizeof arr; i ++) { printf(" %2x", arr[i]); } putchar('n'); return 0; } 

    在我的系统上(在其上签署了普通char ),我得到了这个输出:

      0 10 7f ffffff80 ffffffff 

    当存储在(带符号) char ,值255存储为-1 。 在printf调用中,它被提升为(signed) int - 但是"%2x"格式告诉printf将其视为unsigned int ,因此它显示fffffffff

    确保将mesgmesg_check数组定义为unsigned char数组,而不是普通char

    更新:一年多后重读这个答案,我意识到这不太正确。 这是一个在我的系统上正常运行的程序,几乎肯定可以在任何合理的系统上运行:

     #include  int main(void) { unsigned char arr[] = { 0, 16, 127, 128, 255 }; for (int i = 0; i < sizeof arr; i ++) { printf(" %02x", arr[i]); } putchar('n'); return 0; } 

    输出是:

      00 10 7f 80 ff 

    unsigned char类型的参数被提升为(signed) int (假设int可以包含unsigned char类型的所有值,即INT_MAX >= UCHAR_MAX ,几乎所有系统都是如此)。 因此,参数arr[i]被提升为int ,而" %02x"格式需要类型为unsigned int的参数。

    C标准强烈暗示,但并不完全陈述,相应的有符号和无符号类型的参数是可互换的,只要它们在两种类型的范围内 - 这就是这里的情况。

    完全正确,您需要确保参数实际上是unsigned int类型:

     printf("%02x", (unsigned)arr[i]); 

    是的,总是以hex格式打印字符串:

     for(i=0;till string length;i++) printf("%02X",(unsigned char)str[i]); 

    尝试打印时会出现错误

    如果字符串的格式不是’Unsigned char’,则使用’Unsigned char’逐字符打印hex字符串

    需要了解更多c/c++开发分享使用printf以hex格式打印字符串,结果失真,也可以关注C/ C++技术分享栏目---计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享使用printf以hex格式打印字符串,结果失真相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979765.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐