7

目标是将字节数组写入文件。我有字节数组 fit[] 和一些字节,然后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace _32_to_16
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] fits = File.ReadAllBytes("1.myf");
            byte[] img = new byte[fits.Length / 2];
            for (int i = 0; i < fits.Length; i += 4) //Drops 2 high bytes
            {
                img[i/2] = fits[i + 2];
                img[i/2 + 1] = fits[i + 3];
            }
            File.WriteAllBytes("new.myf", img);
        }
    }
}

在写入文件之前 img[] 具有相同的值:

  • 图像[0]=0x31
  • 图像[1]=0x27
  • 图像[2]=0x31
  • img[3]=0xe2
  • 等等...

写入文件后,在十六进制编辑器中我看到

  • 00000000: 31 27 31 3f 和其他错误值。

有时,使用其他 fit[] 值,img[] 数组可以正确写入文件。我做错了什么?
测试 1.myf 的文件(产生错误的结果)https://www.dropbox.com/s/6xyf761oqm8j7y1/1.myf?dl=0 测试 2.myf 的文件(正确写入文件)https://www .dropbox.com/s/zrglpx7kmpydurz/2.myf?dl=0

我简化了代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace _32_to_16
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] img_correct = new byte[8] { 0xbd, 0x19, 0xbd, 0x72, 0xbd, 0x93, 0xbd, 0xf7 };
            File.WriteAllBytes("img_correct.myf", img_correct);

            byte[] img_strange = new byte[8] { 0x33, 0x08, 0x33, 0xac, 0x33, 0xe3, 0x33, 0x94 };
            File.WriteAllBytes("img_strange.myf", img_strange);
        }
    }
}

在十六进制编辑器 img_correct.myf 中看起来像这样: bd 1​​9 bd 72 bd 93 bd f7

在十六进制编辑器 img_strange.myf 中看起来像这样:33 08 33 3f 3f 3f

4

3 回答 3

10

您正在使用 Notepad++ 的 HEX-Editor 插件,它似乎在读取二进制文件时出现问题

尝试使用另一个十六进制编辑器,它应该显示正确的值。

这是显示相同文件 的HxD和 HEX-Editor 的屏幕截图正如你在这里看到的

于 2016-03-09T14:53:02.030 回答
2

对于全角冒号“:”,正确的 Unicode 格式是:U+ EF1A

但是在记事本++中,十六进制编辑器中的“:”显示“ EFBC9A ”而不是“ EF1A ”。

因为这是一个 UTF8 编码 & 这不是 Unicode 格式。

如果我将“ EFBC9A ”放在另一个编辑器中,它会显示韩文字符“벚”。

当您在 Hex Editor 中直接输入时,请确保使用 UTF8 编码,但当您不在 Hex Editor 中时,请使用 Unicode 格式而不是 UTF8 编码。

所以人们对 UTF8 编码和 Unicode 格式感到困惑。

顺便说一句:U+ EF1A --> ":" 可以放在Windows系统的文件夹名中。

于 2016-10-26T04:29:42.227 回答
1

您的源文件大小可以被 4 整除吗?如果不是,则在操作结束时将忽略任何剩余字节。i += 4 将跳过它们。如果源(适合)文件不能完全被 4 整除,您需要在最后处理这些,在您的 for 循环之后。

于 2016-03-09T14:34:46.863 回答