C#tcp发送二进制与接收不一致!(已解决)
本帖最后由 沉默胜过白金 于 2019-2-2 22:35 编辑直接上图,1 是代码,2是二进制bin源文件,3是接收到的数据。对比2,3对应不起来,黄色为出错数据,红色为多的字节,大体规律为妹8个字节多一个0xC2.
收到以上各楼层的启发,定义的STW为StreamWrite类,只能发送字符,否则转义。
更改BinaryWrite后问题解决!
楼主厉害,我用了这么多年都没发现C#的这个BUG 代码里用(char)类型发数据,在C里边是不敢轻易用这种有符号的发BYTE的,毕竟后者无符号。
另外看到每个 C2 后都紧跟一个≥80H 数据,因此怀疑这个 C2 根本就是自动插入的转义符 dreampet 发表于 2019-2-2 20:12
楼主厉害,我用了这么多年都没发现C#的这个BUG
请问我只想把这个数组的数据原封不动的发出去,这样发是否合适?
C#刚刚上手,不是很熟。谢谢。 t3486784401 发表于 2019-2-2 20:38
代码里用(char)类型发数据,在C里边是不敢轻易用这种有符号的发BYTE的,毕竟后者无符号。
另外看到每个 C2 ...
请问有没有什么方法可以解决,可不可以不用char类型,用别的类型。 沉默胜过白金 发表于 2019-2-2 20:43
请问有没有什么方法可以解决,可不可以不用char类型,用别的类型。
其实没用过 C#,在 C/C++ 下用 unsigned char 或者 BYTE 类型发送 RAW 数组
可以用 wireshark 监视下底层动作,估计到网卡发出之前就已经加 C2 转义了 估计bin_file_buf[]里面就错了,不是按照二进制读进来的吧,是按照文本读的吧。 BYTE []发,BYTE []收,你转个char 说不准就是坑了 leafstamen 发表于 2019-2-2 21:24
估计bin_file_buf[]里面就错了,不是按照二进制读进来的吧,是按照文本读的吧。 ...
bin_file_buf[]里面是对的,用串口升级IAP没问题,现在修改为网口,怀疑STW.Write转义了。 xstt 发表于 2019-2-2 21:33
BYTE []发,BYTE []收,你转个char 说不准就是坑了
BYTE【】发的话,发出去,对面就收到的是31 32 33 34 35 36 .。。这样的数据,都被转换了。 t3486784401 发表于 2019-2-2 20:38
代码里用(char)类型发数据,在C里边是不敢轻易用这种有符号的发BYTE的,毕竟后者无符号。
另外看到每个 C2 ...
确实是转义了,我用
STW.Write((char)(0xaa));
发送0xaa,收到的是c2 aa c2 aa ... 收到以上各楼层的启发,定义的STW为StreamWrite类,只能发送字符,否则转义。
更改BinaryWrite后问题解决! 看了楼主和各位的回复。试了下sizeof(char),得到的值是2。。。 天下乌鸦一般黑 发表于 2019-2-2 22:52
看了楼主和各位的回复。试了下sizeof(char),得到的值是2。。。
C# CHAR是16bit的
本帖最后由 沉默胜过白金 于 2019-2-3 00:22 编辑
天下乌鸦一般黑 发表于 2019-2-2 22:52
看了楼主和各位的回复。试了下sizeof(char),得到的值是2。。。
是的,但是在这里不影响。3楼点到了重点,只要<=0x7F发送就没有问题,应该是这种流不支持,换成二进制流就好了。 问题是不是追到本质比较好,看了一下 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
十几年以前就被坑过,不能转char AnsiChar 与byte对应,我猜普通的char 默认是widechar 吧? 我觉得C#里面各种数据类型比较混乱,使用起来没有C方便。 carryonli 发表于 2019-2-3 07:42
我觉得C#里面各种数据类型比较混乱,使用起来没有C方便。
我也这么觉着,c里面不管什么类型,只要心里不出错,一般错不了,C#转来转去太乱。 真心受教了,这C#看来是真有内容 carryonli 发表于 2019-2-3 07:42
我觉得C#里面各种数据类型比较混乱,使用起来没有C方便。
我到觉得C# 是很舒服的语言。各种语法糖,舒服到ban
页:
[1]