C#中用array.clear()清空byte数组,参数无效的问题

Zpj_fangdang 2017-11-23 07:31:20
...全文
729 18 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xuzuning 2017-11-25
你有 new byte[1024 *1024] 显然图片不都恰好是 1024 *1024 大小 如果都是一样大小 ,就不会有你这个帖子了
  • 打赏
  • 举报
回复
Zpj_fangdang 2017-11-25
引用 16 楼 xuzuning 的回复:
说了多少遍,就是听不进去!? recvbytes 是是定长数组,其尾部有不属于图片的单元 如果你只截取有效部分的长度(count),那就要看这个 count 是如何得来的了
我第一次接收尾部怎么会有不属于图片的数据。
  • 打赏
  • 举报
回复
xuzuning 2017-11-25
说了多少遍,就是听不进去!? recvbytes 是是定长数组,其尾部有不属于图片的单元 如果你只截取有效部分的长度(count),那就要看这个 count 是如何得来的了
  • 打赏
  • 举报
回复
Zpj_fangdang 2017-11-25
[quote=引用 14 楼 xuzuning 的回复:]
没按我的思路,你跟我讨论什么?
至于原始数据是什么样的,从哪里来的都无关紧要,只要能转换成 byte[] 就都一样[/quote
用你的思路,我这样写的,报那里的参数无效,我写的对吗
  • 打赏
  • 举报
回复
xuzuning 2017-11-25
没按我的思路,你跟我讨论什么? 至于原始数据是什么样的,从哪里来的都无关紧要,只要能转换成 byte[] 就都一样
  • 打赏
  • 举报
回复
Zpj_fangdang 2017-11-25
引用 12 楼 xuzuning 的回复:
你这是我的意思吗? 我是说的是 ms 作为全局缓存 MemoryStream ms; 图片文件到二进制方法中 ms = new MemoryStream(File.ReadallBytes”---“)); 二进制到图片方法中 pictureBox1.Image = Image.FromStream(ms);
我上面已说明用的是另一种方法,没用你的方法。而且我所用的图片数据不是图片文件,是用WIFI发送过来的十六进制图片数据。
  • 打赏
  • 举报
回复
guanyinsishengzi 2017-11-24
因为你第二次根本没接收到数据,之所以不加Array.Clear调试正常 是因为还是用的第一次接受的数据 加上Array.Clear后数组里都会变成零,全是0的数组转img就会报参数无效的错误。 所以问题出在接受数据的处理上
  • 打赏
  • 举报
回复
xuzuning 2017-11-24
清空有什么用? 数组是定长的,没有被新数据覆盖的部分,是清空后的空值元素,还是清空前的历史数据,都将破坏图片数据的完整性 你的 图片转二进制 和 二进制转图片,分别是两个独立的方法,你并不能保障在清空 recvbytes 之后,运行二进制转图片之前,recvbytes 中就一定有有效数据 建议你用 MemoryStream 做暂存单元而不是 byte[] 因为 MemoryStream 是变长的,而 byte[] 不是
  • 打赏
  • 举报
回复
xuzuning 2017-11-24
你这是我的意思吗? 我是说的是 ms 作为全局缓存 MemoryStream ms; 图片文件到二进制方法中 ms = new MemoryStream(File.ReadallBytes”---“)); 二进制到图片方法中 pictureBox1.Image = Image.FromStream(ms);
  • 打赏
  • 举报
回复
Zpj_fangdang 2017-11-24
引用 4 楼 xuzuning 的回复:
清空有什么用?
数组是定长的,没有被新数据覆盖的部分,是清空后的空值元素,还是清空前的历史数据,都将破坏图片数据的完整性

你的 图片转二进制 和 二进制转图片,分别是两个独立的方法,你并不能保障在清空 recvbytes 之后,运行二进制转图片之前,recvbytes 中就一定有有效数据

建议你用 MemoryStream 做暂存单元而不是 byte[]
因为 MemoryStream 是变长的,而 byte[] 不是

照你的意思我在函数中做了如下另一种修改但是,调用二进制转图片函数还是显示参数无效,
  • 打赏
  • 举报
回复
Zpj_fangdang 2017-11-24
引用 8 楼 njit_77 的回复:
[quote=引用 6 楼 Zpj_fangdang 的回复:] 4楼,照你的意思我在函数中做了如下另一种修改但是,调用二进制转图片函数还是显示参数无效,
count值每次固定还是变化的?是否会大于recvbytes的容量[/quote] 不是固定的,count的值是接收到的数据的总和。接收的数据大小比recvbytes的容量是小的。
  • 打赏
  • 举报
回复
Zpj_fangdang 2017-11-24
不是固定的,count的值是接收到的数据的总和。接收的数据大小比recvbytes的容量是小的。
  • 打赏
  • 举报
回复
njit_77 2017-11-24
引用 6 楼 Zpj_fangdang 的回复:
4楼,照你的意思我在函数中做了如下另一种修改但是,调用二进制转图片函数还是显示参数无效,
count值每次固定还是变化的?是否会大于recvbytes的容量
  • 打赏
  • 举报
回复
pjy612 2017-11-24
这种我还真不太清楚,另外为了确保数据的完整性,你可以尝试发送的时候 将图片转换成Byte[]然后再转换成 Base64 这样发过来的就是字符串了。 然后接收的时候 也不用考虑得到的 byte[]的长度是不是超了或者不统一。 然后 Base64转换成 Byte[] 再变成图片。 你觉得呢 = =? 实在不行 你就用List<byte> 泛型嘛~ 而且都是Base64的话 你把发送的和你接收到的还能在 文本中比较一下 看看到底是哪里丢了。
  • 打赏
  • 举报
回复
Zpj_fangdang 2017-11-24
4楼,照你的意思我在函数中做了如下另一种修改但是,调用二进制转图片函数还是显示参数无效,
  • 打赏
  • 举报
回复
Zpj_fangdang 2017-11-23
我发送的图片数据。我第一次接收20万个图片字节数据,图片可以正常显示。第二次接收小于20万的数据时,图片显示不正常,第二次接收的数据大于上一次接收的数据时,图片就可以正常显示,我觉得是数组没清空,所以加个清空语句。你们觉得是不是这个原因呢
  • 打赏
  • 举报
回复
Zpj_fangdang 2017-11-23
调试后数组里都是零,Array.Clear(recvbytes, 0, recvbytes.Length);这句不加,就不会这样。
  • 打赏
  • 举报
回复
调试看看吧?
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.7w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
申请成为版主
帖子事件
创建了帖子
2017-11-23 07:31
社区公告

让您成为最强悍的C#开发者