沉默胜过白金 发表于 2019-2-2 18:20:58

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

本帖最后由 沉默胜过白金 于 2019-2-2 22:35 编辑

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


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

更改BinaryWrite后问题解决!

dreampet 发表于 2019-2-2 20:12:35

楼主厉害,我用了这么多年都没发现C#的这个BUG

t3486784401 发表于 2019-2-2 20:38:08

代码里用(char)类型发数据,在C里边是不敢轻易用这种有符号的发BYTE的,毕竟后者无符号。

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

沉默胜过白金 发表于 2019-2-2 20:42:35

dreampet 发表于 2019-2-2 20:12
楼主厉害,我用了这么多年都没发现C#的这个BUG

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

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

沉默胜过白金 发表于 2019-2-2 20:43:08

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

另外看到每个 C2 ...

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

t3486784401 发表于 2019-2-2 20:58:41

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

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

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

leafstamen 发表于 2019-2-2 21:24:28

估计bin_file_buf[]里面就错了,不是按照二进制读进来的吧,是按照文本读的吧。

xstt 发表于 2019-2-2 21:33:04

BYTE []发,BYTE []收,你转个char 说不准就是坑了

沉默胜过白金 发表于 2019-2-2 21:50:32

leafstamen 发表于 2019-2-2 21:24
估计bin_file_buf[]里面就错了,不是按照二进制读进来的吧,是按照文本读的吧。 ...

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

沉默胜过白金 发表于 2019-2-2 21:51:21

xstt 发表于 2019-2-2 21:33
BYTE []发,BYTE []收,你转个char 说不准就是坑了

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

沉默胜过白金 发表于 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 ...

沉默胜过白金 发表于 2019-2-2 22:34:22

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

更改BinaryWrite后问题解决!

天下乌鸦一般黑 发表于 2019-2-2 22:52:20

看了楼主和各位的回复。试了下sizeof(char),得到的值是2。。。

DOER 发表于 2019-2-2 23:02:02

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

C# CHAR是16bit的

沉默胜过白金 发表于 2019-2-3 00:20:32

本帖最后由 沉默胜过白金 于 2019-2-3 00:22 编辑

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

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

wudicgi 发表于 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

nanfang2000 发表于 2019-2-3 07:20:28

十几年以前就被坑过,不能转char

TANK99 发表于 2019-2-3 07:39:34

AnsiChar 与byte对应,我猜普通的char 默认是widechar 吧?

carryonli 发表于 2019-2-3 07:42:29

我觉得C#里面各种数据类型比较混乱,使用起来没有C方便。

沉默胜过白金 发表于 2019-2-3 08:36:33

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

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

t3486784401 发表于 2019-2-3 11:03:32

真心受教了,这C#看来是真有内容

浮华一生 发表于 2019-2-3 12:42:17

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

我到觉得C# 是很舒服的语言。各种语法糖,舒服到ban
页: [1]
查看完整版本: C#tcp发送二进制与接收不一致!(已解决)