吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 808|回复: 1
收起左侧

[求助] c++ send函数 如何发送一个0xbb格式的字节到网络调试助手

[复制链接]
suibianjiejie 发表于 2023-4-21 09:08
如题,大佬们,我想用c++ socket 里的send函数发送一个字节十六进制格式是bb,这该怎么弄呢。

给char赋值bb的十进制187,但是send出去后用网络调试助手接收十六进制显示前面有一串fffff,理想接收应该就是干净的0xbb。求教

send函数我用unsigned char不行,要是哪位知道如何行还请指教

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

chris3will 发表于 2023-4-21 10:45
本帖最后由 chris3will 于 2023-4-21 10:48 编辑

可以尝试以下的代码:

#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main() {
    int sockfd;
    struct sockaddr_in servaddr;

    // 创建socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    // 初始化服务器地址
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);

    // 连接服务器
    connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    // 发送一个字节,十六进制格式为0xbb
    unsigned char buf = 0xbb;
    send(sockfd, &buf, sizeof(unsigned char), 0);

    // 关闭socket
    close(sockfd);

    return 0;
}

在上面的代码中,首先创建了一个socket,然后初始化服务器地址,接着连接服务器。需要发送的数据是一个字节,十六进制格式为0xbb,将该字节赋值给unsigned char类型变量buf,并利用send函数发送该字节。最后关闭socket。

显示前面有一串fffff是因为默认将接收到的数据解析成了有符号数,而0xbb对应的有符号数是-69,因此前面的fffff是符号扩展的结果。如果想要正确地接收十六进制格式为0xbb的数据,可以将数据类型设置为无符号数或者十六进制数。



或者也可以这么理解

使用unsigned char类型是正确的,但是需要注意一些细节。发送数据时,应该将值为187的unsigned char类型转换为十六进制格式的字符串,然后将该字符串作为参数调用send函数发送到网络上。以下是一个简单的示例代码:

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>

int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        std::cerr << "Failed to create socket\n";
        return -1;
    }

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8888);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        std::cerr << "Failed to connect to server\n";
        return -1;
    }

    unsigned char data = 187;
    char hex[3];
    sprintf(hex, "%02x", data);

    if (send(sock, hex, strlen(hex), 0) != strlen(hex)) {
        std::cerr << "Failed to send data\n";
        return -1;
    }

    std::cout << "Data sent successfully\n";

    close(sock);

    return 0;
}

在示例代码中,我们首先创建了一个TCP socket,并连接到指定的服务器地址。然后定义了一个unsigned char类型的变量data,赋值为187,即0xbb。接着使用sprintf函数将该值转换为十六进制格式的字符串,存储在hex数组中。最后,我们将该字符串作为参数调用send函数发送到网络上。

需要注意的是,该示例代码中没有进行错误处理,实际使用时应该根据具体情况进行错误处理。



另外这里的格式化需要强调一下

sprintf(hex, "%02x", data)的含义是将data转换为两个十六进制数的字符串,并将其存储在hex数组中。

具体来说,"%02x"是一个格式控制字符串,指示sprintf函数将data转换为两个十六进制数字,不足两位的数字前面补零。其中,%x是十六进制输出格式的占位符,02表示输出至少两位宽,不足两位则前面补0。

我们之所以要这么做,是因为在网络上传输数据时,通常需要将数据转换为二进制格式的字符串进行传输。在这个过程中,如果直接将十进制数187作为一个字节发送到网络上,接收方可能无法正确地解析该数据。因此,我们需要将其转换为十六进制格式的字符串进行传输,在接收方处再将其转换为十进制数。

在示例代码中,我们使用sprintf函数将data转换为十六进制字符串,然后使用send函数将该字符串发送到网络上。这样可以确保接收方能够正确地解析数据。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表