为什么byte[]转String后,再转成Byte[]会有丢失的现象?

雄牛 2017-08-14 09:55:16
是这样的,我用socket传输自定义文件格式,文件中含有文件名,文件时间,文件流转成的byte[]内容,
传过去后,查看接收的缓冲区,byte[]是没错的,但第二行将byte[]转成string后,再转回去,长度就少了很多,
为什么呢....????
像下面的句子那样的逻辑,可是如果输的是简单的字符是没问题,但我的文件是含图片,文件这样的数据...
是什么原因呢,两边的码制是一样的...




byte[] tmpStr1 = System.Text.Encoding.Default.GetBytes("数据文件(略)");
string headerStr = System.Text.Encoding.Default.GetString(tmpStr1);
byte[] tmpStr2 = System.Text.Encoding.Default.GetBytes(headerStr);//在这里的byte的长度和tmpStr1 不一样了???????????
...全文
1565 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 9 楼 cowbo 的回复:
[quote=引用 7 楼 starfd 的回复:] 你的default不支持你的中文,已经乱码了
我是用下面的函数来把文件流转成byte[]数组的,之前用的方案是文件名,时间和文件流分开socket传输是没问题的. 但文件太多时有问题,所以改成把文件名和时间文件流放在一起传,就出现了这种情况.但为什么本机测试时用一个变量来接收也是少的? 如果不用default用什么好?软件可能会在很多语言环境下使用....[/quote] 从前到后,也根本看不出你是怎么“一起传”、然后在接收端又是怎么处理分包和粘包问题的。这可以看作是一个很基本的问题,但是你隐去了你自己的实际的东西,所以没法回答。
  • 打赏
  • 举报
回复
引用 楼主 cowbo 的回复:
是这样的,我用socket传输自定义文件格式,文件中含有文件名,文件时间,文件流转成的byte[]内容, 传过去后,查看接收的缓冲区,byte[]是没错的,但第二行将byte[]转成string后,再转回去,长度就少了很多, 为什么呢....???? 像下面的句子那样的逻辑,可是如果输的是简单的字符是没问题,但我的文件是含图片,文件这样的数据... 是什么原因呢,两边的码制是一样的...

                                    byte[] tmpStr1 = System.Text.Encoding.Default.GetBytes("数据文件(略)");
                                    string headerStr = System.Text.Encoding.Default.GetString(tmpStr1);
                                    byte[] tmpStr2 = System.Text.Encoding.Default.GetBytes(headerStr);//在这里的byte的长度和tmpStr1 不一样了???????????
完全看不懂你写这3行代码的实际意义啊。图片又不是字符串,你把图片的 byte [ ] 执行 GetString 会得到图片吗?
泡泡龙 2017-08-16
  • 打赏
  • 举报
回复
用base64编码转成字符串
xuzuning 2017-08-16
  • 打赏
  • 举报
回复
但我的文件是含图片,文件这样的数据 问题就在这里! Encoding 中文释义:编码 而 图片数据是原始二进制数据,不遵从任何语言的编码规则 所以在转换中,丢掉一些不符合指定编码的数据是正常的
雄牛 2017-08-15
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
Encoding.Default是什么编码,如果是汉字,不能确定,最好用getEncode("gb2312")之类指定下,不要用Encoding.Default
调试时看了一下,是gb2312编码没错的,在一台电脑上做发和接测试也是一样的结果
threenewbee 2017-08-15
  • 打赏
  • 举报
回复
Encoding.Default是什么编码,如果是汉字,不能确定,最好用getEncode("gb2312")之类指定下,不要用Encoding.Default
  • 打赏
  • 举报
回复
你的socket没定义文件头吗?不是应该前几个byte用来读取这个包的长度是多少吗?然后根据这个来读取
雄牛 2017-08-15
  • 打赏
  • 举报
回复

//文件流转成byte[]数组
 public static byte[] FileToArrayByte(FileStream fs)
        {
            try
            {
                byte[] arrFile = new byte[fs.Length];//定义大小
                int length = fs.Read(arrFile, 0, arrFile.Length);  // 将文件中的数据读到arrFile数组中;               
                return arrFile;
            }
            catch (System.Exception ex)
            {
                return null;
            }
        }

雄牛 2017-08-15
  • 打赏
  • 举报
回复
引用 7 楼 starfd 的回复:
你的default不支持你的中文,已经乱码了
我是用下面的函数来把文件流转成byte[]数组的,之前用的方案是文件名,时间和文件流分开socket传输是没问题的. 但文件太多时有问题,所以改成把文件名和时间文件流放在一起传,就出现了这种情况.但为什么本机测试时用一个变量来接收也是少的? 如果不用default用什么好?软件可能会在很多语言环境下使用....
雄牛 2017-08-15
  • 打赏
  • 举报
回复
引用 5 楼 xian_wwq 的回复:
如果从byte[]转到string时,恰巧出现结束字符,那么就自动被截断了 问题是socket传输的时候, 没必要把byte[]和string来回互转
引用 4 楼 wddw1986 的回复:
你把数据文件转成了字符串?数据文件直接就是二进制,还转成字符串再转回二进制,真是脱了裤子放屁。
我的是不固定长度的,所以用Array.Copy和Skip.Take的方法不太好用,还有什么办法吗
  • 打赏
  • 举报
回复
你的default不支持你的中文,已经乱码了
雄牛 2017-08-15
  • 打赏
  • 举报
回复
引用 5 楼 xian_wwq 的回复:
如果从byte[]转到string时,恰巧出现结束字符,那么就自动被截断了 问题是socket传输的时候, 没必要把byte[]和string来回互转
那如何通过固定字节,比如:0,23,8,9和0,0,0,9,10之间的字节?
xian_wwq 2017-08-15
  • 打赏
  • 举报
回复
如果从byte[]转到string时,恰巧出现结束字符,那么就自动被截断了 问题是socket传输的时候, 没必要把byte[]和string来回互转
cheng2005 2017-08-15
  • 打赏
  • 举报
回复
你把数据文件转成了字符串?数据文件直接就是二进制,还转成字符串再转回二进制,真是脱了裤子放屁。
homesos 2017-08-15
  • 打赏
  • 举报
回复
是你的socket发收数据有问题吧?你看一下,收完的byte数组里最后一位跟发送的最后一位是不是一样的。

111,086

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧