搜索
bottom↓
回复: 21

C#tcp发送二进制与接收不一致!(已解决)

[复制链接]

出0入0汤圆

发表于 2019-2-2 18:20:58 | 显示全部楼层 |阅读模式
本帖最后由 沉默胜过白金 于 2019-2-2 22:35 编辑

直接上图,1 是代码,2是二进制bin源文件,3是接收到的数据。对比2,3对应不起来,黄色为出错数据,红色为多的字节,大体规律为妹8个字节多一个0xC2.


收到以上各楼层的启发,定义的STW为StreamWrite类,只能发送字符,否则转义。

更改BinaryWrite后问题解决!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入147汤圆

发表于 2019-2-2 20:12:35 来自手机 | 显示全部楼层
楼主厉害,我用了这么多年都没发现C#的这个BUG

出200入2554汤圆

发表于 2019-2-2 20:38:08 来自手机 | 显示全部楼层
代码里用(char)类型发数据,在C里边是不敢轻易用这种有符号的发BYTE的,毕竟后者无符号。

另外看到每个 C2 后都紧跟一个≥80H 数据,因此怀疑这个 C2 根本就是自动插入的转义符

出0入0汤圆

 楼主| 发表于 2019-2-2 20:42:35 | 显示全部楼层
dreampet 发表于 2019-2-2 20:12
楼主厉害,我用了这么多年都没发现C#的这个BUG

请问我只想把这个数组的数据原封不动的发出去,这样发是否合适?

C#刚刚上手,不是很熟。谢谢。

出0入0汤圆

 楼主| 发表于 2019-2-2 20:43:08 | 显示全部楼层
t3486784401 发表于 2019-2-2 20:38
代码里用(char)类型发数据,在C里边是不敢轻易用这种有符号的发BYTE的,毕竟后者无符号。

另外看到每个 C2 ...

请问有没有什么方法可以解决,可不可以不用char类型,用别的类型。

出200入2554汤圆

发表于 2019-2-2 20:58:41 | 显示全部楼层
沉默胜过白金 发表于 2019-2-2 20:43
请问有没有什么方法可以解决,可不可以不用char类型,用别的类型。

其实没用过 C#,在 C/C++ 下用 unsigned char 或者 BYTE 类型发送 RAW 数组

可以用 wireshark 监视下底层动作,估计到网卡发出之前就已经加 C2 转义了

出0入57汤圆

发表于 2019-2-2 21:24:28 来自手机 | 显示全部楼层
估计bin_file_buf[]里面就错了,不是按照二进制读进来的吧,是按照文本读的吧。

出0入16汤圆

发表于 2019-2-2 21:33:04 | 显示全部楼层
BYTE []发,BYTE []收,你转个char 说不准就是坑了

出0入0汤圆

 楼主| 发表于 2019-2-2 21:50:32 | 显示全部楼层
leafstamen 发表于 2019-2-2 21:24
估计bin_file_buf[]里面就错了,不是按照二进制读进来的吧,是按照文本读的吧。 ...

bin_file_buf[]里面是对的,用串口升级IAP没问题,现在修改为网口,怀疑STW.Write转义了。

出0入0汤圆

 楼主| 发表于 2019-2-2 21:51:21 | 显示全部楼层
xstt 发表于 2019-2-2 21:33
BYTE []发,BYTE []收,你转个char 说不准就是坑了

BYTE【】发的话,发出去,对面就收到的是31 32 33 34 35 36 .。。这样的数据,都被转换了。

出0入0汤圆

 楼主| 发表于 2019-2-2 21:55:34 | 显示全部楼层
t3486784401 发表于 2019-2-2 20:38
代码里用(char)类型发数据,在C里边是不敢轻易用这种有符号的发BYTE的,毕竟后者无符号。

另外看到每个 C2 ...

确实是转义了,我用
STW.Write((char)(0xaa));

发送0xaa,收到的是c2 aa c2 aa ...

出0入0汤圆

 楼主| 发表于 2019-2-2 22:34:22 | 显示全部楼层
收到以上各楼层的启发,定义的STW为StreamWrite类,只能发送字符,否则转义。

更改BinaryWrite后问题解决!

出20入62汤圆

发表于 2019-2-2 22:52:20 | 显示全部楼层
看了楼主和各位的回复。试了下sizeof(char),得到的值是2。。。

出0入17汤圆

发表于 2019-2-2 23:02:02 | 显示全部楼层
天下乌鸦一般黑 发表于 2019-2-2 22:52
看了楼主和各位的回复。试了下sizeof(char),得到的值是2。。。

C# CHAR是16bit的

出0入0汤圆

 楼主| 发表于 2019-2-3 00:20:32 | 显示全部楼层
本帖最后由 沉默胜过白金 于 2019-2-3 00:22 编辑
天下乌鸦一般黑 发表于 2019-2-2 22:52
看了楼主和各位的回复。试了下sizeof(char),得到的值是2。。。


是的,但是在这里不影响。3楼点到了重点,只要<=0x7F发送就没有问题,应该是这种流不支持,换成二进制流就好了。

出0入0汤圆

发表于 2019-2-3 01:54:50 | 显示全部楼层
问题是不是追到本质比较好,看了一下 StreamWriter 如果用的是 public StreamWriter(Stream stream) 这个构造函数的话,Encoding 默认是 UTF8NoBOM
public StreamWriter(Stream stream) : this(stream, UTF8NoBOM, 0x400)

而像 0xAA 这种值显然超 0x7F 了,那按 UTF-8 编码,0xAA 在 000080 - 0007FF 这个范围,会被编码为 2 个字节 110yyyyy (C0-DF) 10zzzzzz (80-BF),
0xAA = 0b10101010, 编码完就是 11000010 10101010 了,也就是 0xC2, 0xAA

出0入0汤圆

发表于 2019-2-3 07:20:28 来自手机 | 显示全部楼层
十几年以前就被坑过,不能转char

出0入0汤圆

发表于 2019-2-3 07:39:34 来自手机 | 显示全部楼层
AnsiChar 与byte对应,我猜普通的char 默认是widechar 吧?

出0入0汤圆

发表于 2019-2-3 07:42:29 | 显示全部楼层
我觉得C#里面各种数据类型比较混乱,使用起来没有C方便。

出0入0汤圆

 楼主| 发表于 2019-2-3 08:36:33 | 显示全部楼层
carryonli 发表于 2019-2-3 07:42
我觉得C#里面各种数据类型比较混乱,使用起来没有C方便。

我也这么觉着,c里面不管什么类型,只要心里不出错,一般错不了,C#转来转去太乱。

出200入2554汤圆

发表于 2019-2-3 11:03:32 来自手机 | 显示全部楼层
真心受教了,这C#看来是真有内容

出0入0汤圆

发表于 2019-2-3 12:42:17 | 显示全部楼层
carryonli 发表于 2019-2-3 07:42
我觉得C#里面各种数据类型比较混乱,使用起来没有C方便。

我到觉得C# 是很舒服的语言。各种语法糖,舒服到ban
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 02:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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