Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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# 如何将文件读入字节,并找到要匹配的十六进制字符串?_C#_Hex_Byte - Fatal编程技术网

C# 如何将文件读入字节,并找到要匹配的十六进制字符串?

C# 如何将文件读入字节,并找到要匹配的十六进制字符串?,c#,hex,byte,C#,Hex,Byte,我想读取文件的内容并在数据中找到十六进制匹配项。我觉得使用“file.readallbytes”太过分了,因为我只需要逐字节读取,直到找到十六进制匹配为止。我是否可以使用更好的替代方案,或者使用readallbytes对性能更有利?我在下面所做的工作目前仍按原样进行 我试图读取的文件是一个简单的文本文件,其中包含“hello” 由于mfatih更新了解决方案: public void example() { string match = "68656C6C6F"; //This is

我想读取文件的内容并在数据中找到十六进制匹配项。我觉得使用“file.readallbytes”太过分了,因为我只需要逐字节读取,直到找到十六进制匹配为止。我是否可以使用更好的替代方案,或者使用readallbytes对性能更有利?我在下面所做的工作目前仍按原样进行

我试图读取的文件是一个简单的文本文件,其中包含“hello”

由于mfatih更新了解决方案:

public void example()
{

    string match = "68656C6C6F"; //This is "hello" in hex
    byte[] matchBytes = StringToByteArray(match);


    foreach (var jsFile in jsscan)
    {
        using (var fs = new FileStream(jsFile, FileMode.Open))
        {
            int i = 0;
            int readByte;
            while ((readByte = fs.ReadByte()) != -1)
            {
                if (matchBytes[i] == readByte)
                {
                    i++;
                }
                else
                {
                    i = 0;
                }
                if (i == matchBytes.Length)
                {
                    Console.WriteLine("It found between {0} and {1}.", 
                       fs.Position - matchBytes.Length, fs.Position);
                    break;
                }
            }
       }
    }
}
public static byte[] StringToByteArray(String hex)
{
    int NumberChars = hex.Length;
    byte[] bytes = new byte[NumberChars / 2];
    for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
    return bytes;
 }
public void示例()
{
string match=“68656C6F”;//这是十六进制的“hello”
字节[]匹配字节=StringToByteArray(匹配);
foreach(jsscan中的var jsFile)
{
使用(var fs=newfilestream(jsFile,FileMode.Open))
{
int i=0;
int读取字节;
而((readByte=fs.readByte())!=-1)
{
if(matchBytes[i]==readByte)
{
i++;
}
其他的
{
i=0;
}
if(i==matchBytes.Length)
{
WriteLine(“它位于{0}和{1}之间。”,
fs.Position-matchBytes.Length,fs.Position);
打破
}
}
}
}
}
公共静态字节[]StringToByteArray(字符串十六进制)
{
int numbercars=十六进制长度;
字节[]字节=新字节[numbercars/2];
对于(int i=0;i
有一种更有效的方法,无需读取整个文件。我希望这种方式能帮助你

string match = "68656C6C6F";

byte[] matchBytes = Encoding.ASCII.GetBytes(match);

foreach (var jsFile in jsscan)
{
    using (var fs = new FileStream(jsFile, FileMode.Open))
    {
        int i = 0;
        int readByte;
        while ((readByte = fs.ReadByte()) != -1)
        {
            if (matchBytes[i] == readByte)
            {
                i++;
            }
            else
            {
                i = 0;
            }
            if (i == matchBytes.Length)
            {
                Console.WriteLine("It found between {0} and {1}.", 
                       fs.Position - matchBytes.Length, fs.Position);
                break;
            }
        }
   }
}

您是否考虑将输入十六进制数转换为字符串并执行比较?嘿,不走运!是的,我相信这就是我现在正在做的,对吗?我正在将每个文件的readallbytes转换为十六进制格式,然后使用“Contains”将十六进制匹配为字符串。我只是想知道是否有一种更有效的方法不必读取整个文件?我也不想从一个特定的偏移量开始,只是一般的整个文件。Hi的可能副本这很好!请让我知道它正在查找该字符串的位置。如何将该字符串从该位置获取到所需的长度?这看起来很可靠,但在将文件读取到文件流时,我无法使其正常工作。“我不能让它工作”的意思是,它不会显示正在查找的字节的控制台输出。我已经确定它也在查看正确的文件。好的,我已经调试了它,它看起来在if(matchBytes[I]==readByte)方面失败了。我认为“byte[]matchBytes=Encoding.ASCII.GetBytes(match);”的实现不正确。它将matchBytes显示为空。有什么想法吗?用“byte[]matchBytes={104101108111}”替换GetBytes函数,确认GetBytes函数不能正常工作,并且它按预期工作。如果我找到原因,我会做更多的研究并更新我的帖子或者您可以尝试
byte[]matchBytes=System.Text.Encoding.ASCII.GetBytes(匹配)。此链接可以为StringToByteArray提供更有效的转换选项
string match = "68656C6C6F";

byte[] matchBytes = Encoding.ASCII.GetBytes(match);

foreach (var jsFile in jsscan)
{
    using (var fs = new FileStream(jsFile, FileMode.Open))
    {
        int i = 0;
        int readByte;
        while ((readByte = fs.ReadByte()) != -1)
        {
            if (matchBytes[i] == readByte)
            {
                i++;
            }
            else
            {
                i = 0;
            }
            if (i == matchBytes.Length)
            {
                Console.WriteLine("It found between {0} and {1}.", 
                       fs.Position - matchBytes.Length, fs.Position);
                break;
            }
        }
   }
}