Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在PNG文件中替换CRLF_C#_Binary_Adb_Screenshot - Fatal编程技术网

C# 在PNG文件中替换CRLF

C# 在PNG文件中替换CRLF,c#,binary,adb,screenshot,C#,Binary,Adb,Screenshot,我试图用LF替换CRLF(参见原因@) 上面引用的线程的一个简要总结是,基本上,当通过Android调试桥从Android设备传输屏幕截图时,数据流中的换行符换行符换行符被替换为回车换行符,因此我在管道的另一端接收到一个损坏的文件。对其他人有效的方法是通过代码撤销替换,如下所示,但对我来说似乎不起作用 我的代码仍在吐出一个损坏的文件。。。你知道为什么吗 ++我知道代码不是那么干净和有效,它可以,将修复后,所以请保留与我的编码技能,或缺乏相关的意见 谢谢 static void M

我试图用LF替换CRLF(参见原因@)

上面引用的线程的一个简要总结是,基本上,当通过Android调试桥从Android设备传输屏幕截图时,数据流中的换行符换行符换行符被替换为回车换行符,因此我在管道的另一端接收到一个损坏的文件。对其他人有效的方法是通过代码撤销替换,如下所示,但对我来说似乎不起作用

我的代码仍在吐出一个损坏的文件。。。你知道为什么吗

++我知道代码不是那么干净和有效,它可以,将修复后,所以请保留与我的编码技能,或缺乏相关的意见

谢谢

        static void Main(string[] args)
        {
            // adb shell screencap -p > <path>
            string path = @"<filepath>\screen.png";

            var fs = new FileStream(path, FileMode.Open);
            var fsw = new FileStream(path.Replace(".png", "_fixed.png"), FileMode.Create);

            var buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            fs.Flush();
            fs.Close();

            var switched = Repair(buffer);
            fsw.Write(switched, 0, switched.Length);
            fsw.Flush();
            fsw.Close();

            Console.WriteLine(buffer.Length);
            Console.WriteLine(switched.Length);

            Console.Read();
        }

        static byte[] Repair(byte[] enc)
        {
            var bstr = new MemoryStream();
            for (int i = 0; i < enc.Length; i++)
            {
                if (enc.Length > i + 1 && enc[i] == 0x0d && enc[i + 1] == 0x0a)
                {
                    bstr.WriteByte(0x0a);
                    i++;
                }
                else bstr.WriteByte(enc[i]);
            }

            bstr.Flush();
            bstr.Close();

            return bstr.ToArray();
        }
static void Main(字符串[]args)
{
//亚洲开发银行外壳屏蔽盖-p>
字符串路径=@“\screen.png”;
var fs=新文件流(路径,FileMode.Open);
var fsw=newfilestream(path.Replace(“.png”,“_fixed.png”)、FileMode.Create);
var buffer=新字节[fs.Length];
fs.Read(buffer,0,buffer.Length);
fs.Flush();
fs.Close();
var开关=维修(缓冲);
fsw.Write(切换,0,切换长度);
fsw.Flush();
fsw.Close();
控制台写入线(缓冲区长度);
控制台写入线(切换长度);
Console.Read();
}
静态字节[]修复(字节[]enc)
{
var bstr=新内存流();
对于(int i=0;ii+1&&enc[i]==0x0d&&enc[i+1]==0x0a)
{
bstr.WriteByte(0x0a);
i++;
}
else bstr.WriteByte(附件[i]);
}
bstr.Flush();
bstr.Close();
返回bstr.ToArray();
}

我是否正确理解您试图更改二进制数据中的行尾?如果是这样,您如何保证您正在更改的特定字节序列是嵌入文本而不是二进制值?@adv12是。文件格式为PNG。有关更多信息,请参阅链接线程。我从工作中的Java移植了这个,它基本上成功地做了同样的事情。。。我想知道是否有一些C#guru能够发现任何错误或进一步的见解。Cheers-DF。你说的损坏到底是什么意思?确保你检查了fs.Read(buffer,0,buffer.Length)的返回值。它有时可能小于请求的值(
buffer.Length
)。你能发布这两个文件(正确的png和损坏的png)吗?顺便说一句,我建议你在问题的顶部简短解释一下为什么要这么做,因为很多人没有仔细阅读链接的帖子:)