【笔记】QT分块传输文件 【memecpy(array.data(),total_array.data(),LOADSIZE)】报错崩溃

这里本来想用tcpsocket实际试验一下,不过后来发现这样还要再写个服务器有点麻烦,这里直接验证利用QBtyteArrary分小块array发,对方收到后一直append到recv_arrary里,最后可以还原文件,已经验证jpg,xlsx都可以,注意小块的array也用append添加内容,而不可以用memecpy(array.data(),total_array.data(),LOADSIZE),memcpy最前面那个目标地址不可以写array.data(),不过第二个参数源地址可以,比如memcpy((char*)&msg,array.data()+sizeof(packHead),array.size()-sizeof(packHead));,如果是array还是用append,就会自动加到这个array的data部分了,在每次循环里都是一个新的QByteArray array;不需要array.clear(),出了花括号作用域自己就回收了。

#include "widget.h"
#include "ui_widget.h"
#include <QApplication>
#include <QDebug>
#include <QHostAddress>
#include <QByteArray>
#include <QFile>
#define LOADSIZE 500

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QHostAddress *serverIP;
    serverIP = new QHostAddress();
    QString ip = "127.0.0.1";
    int port = 8888;
    if(!serverIP->setAddress(ip))//用这个函数判断IP地址是否可以被正确解析
    {

        "IP is error";
        return;
    }

        tcps
/* Copyright(c) 2009-2025 Shenzhen TP-LINK Technologies Co. Ltd. * Author: ChenZhuo chenzhuo1@tp-link.com.hk * Date: 2025-07-30 15:48:14 * LastEditors: ChenZhuo chenzhuo1@tp-link.com.hk * LastEditTime: 2025-07-31 18:11:06 * FilePath: /project/practice1/bulk_mem_cpy.c * Description: 提高memcpy效率,编写新的内存函数 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> /**************************************************************************************************/ /* DEFINES */ /**************************************************************************************************/ /* 定义字符数组长度 */ #define MAXLEN 100 /**************************************************************************************************/ /* LOCAL_PROTOTYPES */ /**************************************************************************************************/ /* 自编块拷贝函数 */ static int bulk_mem_cpy(unsigned char *to, unsigned char *from, int len); static char random_char(); static int min(int a, int b); /**************************************************************************************************/ /* LOCAL_FUNCTIONS */ /**************************************************************************************************/ /* * fn static char random_char() * brief 生成随机字符 * param[out] 生成的随机字符 */ static char random_char() { int random_value = rand() % 62; // 62是字母和数字的总数 if (random_value < 26) { return 'A' + random_value; // 生成大写字母 } else if (random_value < 52) { return 'a' + (random_value - 26); // 生成小写字母 } else { return '0' + (random_value - 52); // 生成数字 } } static int min(int a, int b) { return (a < b) ? a : b; } /* * fn buk_mem_cpy(unsigned char *to, unsigned char *from, int len) * brief 使用8字节拷贝代替memcpy单字节拷贝提升效率,并解决内存重叠问题。 * param[in] to 目标区域首地址 * param[in] from 源区域地址 * param[in] len 拷贝字节长度 */ static int bulk_mem_cpy(unsigned char *to, unsigned char *from, int len) { if (len <= 0) return 0; // 处理无效长度 /* 定义拷贝长度 */ const size_t word_size = sizeof(unsigned long long); /* 目标内存和源内存结束位置 */ unsigned char *end_to = to + len; unsigned char *end_from = from + len; // 检查内存重叠:当 to 在 from 和 from+len 之间时需要反向复制 if (from < to && to < from + len) { // 从后向前复制(处理重叠) while (len > 0) { // 按机器字长分块复制 if (len >= word_size) { end_to -= word_size; end_from -= word_size; *(unsigned long long *)end_to = *(unsigned long long *)end_from; len -= word_size; } // 剩余字节复制 else { *--end_to = *--end_from; len--; } } } // 无重叠或 to 在 from 之前(安全正向复制) else { while (len > 0) { // 8字节拷贝 if (len >= word_size) { *(unsigned long long *)to = *(unsigned long long *)from; to += word_size; from += word_size; len -= word_size; } // 剩余逐字节复制 else { *to++ = *from++; len--; } } } return 0; } int main() { /* 用于两个函数拷贝结果比较的字符串 */ char test_str_memcpy[MAXLEN]; char test_str_bulkcpy[MAXLEN]; /* 源区域、目标区域以及拷贝长度定义 */ unsigned int src; unsigned int dst; unsigned int len; int time_memcpy; int time_bulcpy; int begintime_memcpy,endtime_memcpy; int begintime_bulcpy,endtime_bulcpy; /* 总共测试次数 */ unsigned int test_time = 10; /* 测试计数 */ int times = 1; while (test_time--) { /* 随机生成字符串 */ for (int i = 0; i < MAXLEN; i++) { char c = random_char(); /* 生成两组相同的随机测试字符串 */ test_str_memcpy[i] = c; test_str_bulkcpy[i] = c; } /* 随机选择源位置和目的位置 */ src = rand() % MAXLEN; dst = rand() % MAXLEN; /* 随机选择拷贝的长度 */ len = rand() % min(MAXLEN - src, MAXLEN - dst); /* 拷贝测试 */ begintime_bulcpy = clock(); bulk_mem_cpy(test_str_bulkcpy + dst, test_str_bulkcpy + src, len); endtime_bulcpy = clock(); time_bulcpy += (endtime_bulcpy - begintime_bulcpy); begintime_memcpy = clock(); memcpy(test_str_memcpy + dst, test_str_memcpy + src, len); endtime_memcpy = clock(); time_memcpy += (endtime_memcpy - begintime_memcpy); /* 检验结果 */ if (memcmp(test_str_memcpy, test_str_bulkcpy, MAXLEN) == 0) { /* 测试成功 */ printf("第%d次测试正确\n",times); printf("源位置:%d\n目标位置:%d\n拷贝长度:%d\n",src,dst,len); printf("memcpy拷贝结果:%s\n",test_str_memcpy); printf("bulk_mem_cpy拷贝结果:%s\n",test_str_bulkcpy); times++; } else { /* fail */ printf("第%d次测试错误\n",times); printf("源位置:%d\n目标位置:%d\n拷贝长度:%d\n",src,dst,len); printf("%s",test_str_memcpy); printf("%s",test_str_bulkcpy); times++; break; } printf("\n memecpy running Time is : %dms\n", time_memcpy); printf("\n bulk_mem_cpy running Time is : %dms\n", time_bulcpy); } return 0; } 检查一下我的代码有没有问题
最新发布
08-07
/* Copyright(c) 2009-2025 Shenzhen TP-LINK Technologies Co. Ltd. * Author: ChenZhuo chenzhuo1@tp-link.com.hk * Date: 2025-07-30 15:48:14 * LastEditors: ChenZhuo chenzhuo1@tp-link.com.hk * LastEditTime: 2025-07-31 18:11:06 * FilePath: /project/practice1/bulk_mem_cpy.c * Description: 提高memcpy效率,编写新的内存函数 */ #include <stdio.h> #include <string.h> #include <time.h> /**************************************************************************************************/ /* DEFINES */ /**************************************************************************************************/ /* 定义字符数组最大长度 */ #define MAXLEN 500000 /**************************************************************************************************/ /* LOCAL_PROTOTYPES */ /**************************************************************************************************/ /* 自编块拷贝函数 */ static int bulk_mem_cpy(unsigned char *to, unsigned char *from, int len); /**************************************************************************************************/ /* LOCAL_FUNCTIONS */ /**************************************************************************************************/ char random_char() { int random_value = rand() % 62; // 62是字母和数字的总数 if (random_value < 26) { return 'A' + random_value; // 生成大写字母 } else if (random_value < 52) { return 'a' + (random_value - 26); // 生成小写字母 } else { return '0' + (random_value - 52); // 生成数字 } } int min(int a, int b) { return (a < b) ? a : b; } /* * fn buk_mem_cpy(unsigned char *to, unsigned char *from, int len) * brief 使用8字节拷贝代替memcpy单字节拷贝提升效率,并解决内存重叠问题。 * param[in] to 目标区域首地址 * param[in] from 源区域地址 * param[in] len 拷贝字节长度 */ static int bulk_mem_cpy(unsigned char *to, unsigned char *from, int len) { if (len <= 0) return 0; // 处理无效长度 const size_t word_size = sizeof(unsigned long); // 获取机器字长(通常4或8字节) unsigned char *end_to = to + len; // 目标内存结束位置 unsigned char *end_from = from + len; // 源内存结束位置 // 检查内存重叠:当 to 在 from 和 from+len 之间时需要反向复制 if (from < to && to < from + len) { // 从后向前复制(处理重叠) while (len > 0) { // 按机器字长分块复制 if (len >= word_size) { end_to -= word_size; end_from -= word_size; *(unsigned long *)end_to = *(unsigned long *)end_from; len -= word_size; } // 剩余字节复制 else { *--end_to = *--end_from; len--; } } } // 无重叠或 to 在 from 之前(安全正向复制) else { while (len > 0) { // 按机器字长分块复制 if (len >= word_size) { *(unsigned long *)to = *(unsigned long *)from; to += word_size; from += word_size; len -= word_size; } // 剩余字节复制 else { *to++ = *from++; len--; } } } return 0; // 返回成功(实际应用中可返回复制的字节数) } int main() { int begintime, endtime; int test_begintime, test_endtime; char test_str_memcpy[MAXLEN]; char test_str_bulcpy[MAXLEN]; unsigned int src; unsigned int dst; unsigned int len; unsigned int test_time = 10; while (test_time--) { /* 随机生成字符串 */ for (int i = 0; i < MAXLEN; i++) { char c = random_char(); test_str_memcpy[i] = c; test_str_bulcpy[i] = c; } /* 随机选择源位置和目的位置 */ src = rand() % MAXLEN; dst = rand() % MAXLEN; /* 随机选择拷贝的长度 */ len = rand() % min(MAXLEN - src, MAXLEN - dst); test_begintime = clock(); bulk_mem_cpy(test_str_bulcpy + dst, test_str_bulcpy + src, len); test_endtime = clock(); printf("\n bulk_mem_cpy running Time is : %dms\n", test_endtime - test_begintime); begintime = clock(); memcpy(test_str_memcpy + dst, test_str_memcpy + src, len); endtime = clock(); printf("\n memecpy running Time is : %dms\n", endtime - begintime); /* 检验结果 */ if (memcmp(test_str_memcpy, test_str_bulcpy, 100) == 0) { /* success */ printf("自编函数正确"); } else { /* fail */ printf("自编函数失败"); } } return 0; } 检查我的代码是否有误,并且帮我优化,我想比较较大数量的情况
08-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值