문제

그래서 거래는 다음과 같습니다. 파일 (바이트에서)을 열고 문자열로 변환하여 헤더에서 메타 데이터를 엉망으로 만들고 바이트로 다시 변환하여 저장할 수 있습니다. 내가 지금 실행하는 문제는이 코드와 관련이 있습니다. 앞뒤로 변환 된 문자열을 원래 바이트 배열과 비교할 때는 불평등합니다. 이 작업을 어떻게 만들 수 있습니까?

public static byte[] StringToByteArray(string str)
{
    UTF8Encoding encoding = new UTF8Encoding();
    return encoding.GetBytes(str);
}

public string ByteArrayToString(byte[] input)
{
    UTF8Encoding enc = new UTF8Encoding();
    string str = enc.GetString(input);
    return str;
}

내가 그들을 비교하는 방법은 다음과 같습니다.

byte[] fileData = GetBinaryData(filesindir[0], Convert.ToInt32(fi.Length));
string fileDataString = ByteArrayToString(fileData);
byte[] recapturedBytes = StringToByteArray(fileDataString);
Response.Write((fileData == recapturedBytes));

UTF-8이라고 확신합니다.

StreamReader sr = new StreamReader(filesindir[0]);
Response.Write(sr.CurrentEncoding);

"system.text.utf8encoding"을 반환합니다.

도움이 되었습니까?

해결책

정적 함수를 시도하십시오 Encoding 다양한 인코딩 인스턴스를 제공하는 클래스. 인스턴스화 할 필요는 없습니다 Encoding 바이트 배열로/에서 변환하기 만하면됩니다. 코드의 문자열을 어떻게 비교하고 있습니까?

편집하다

당신은 문자열이 아닌 배열을 비교하고 있습니다. 그들은 두 개의 다른 배열을 언급하기 때문에 불균형합니다. 사용 == 운영자는 값이 아니라 참조 만 비교합니다. 배열의 각 요소를 검사하여 동등한 지 확인해야합니다.

public bool CompareByteArrays(byte[] lValue, byte[] rValue)
{
    if(lValue == rValue) return true; // referentially equal
    if(lValue == null || rValue == null) return false; // one is null, the other is not
    if(lValue.Length != rValue.Length) return false; // different lengths

    for(int i = 0; i < lValue.Length; i++)
    {
        if(lValue[i] != rValue[i]) return false;
    }

    return true;
}

다른 팁

원시 바이트 (8 비트 인쇄 할 수없는 문자)가 있고 .NET 문자열로 조작하고 바이트로 다시 바꾸려면 사용하여 사용할 수 있습니다.

Encoding.GetEncoding(1252)

utf8encoding 대신. 이 인코딩은 8 비트 값을 가져 와서 정보를 잃지 않고 .NET 16 비트 숯으로 변환하고 다시 다시 돌아갑니다.

이진 파일로 위에서 설명한 특정 경우에는 "헤더에 메타 데이터를 엉망으로 만들지"않을 것입니다. 예를 들어 헤더에 포함 된 경우

{any}{any}ABC{any}{any}

ABC를 DEF로 변경하고 싶습니다. 원하는대로 작동해야합니다. 그러나 ABC를 WXYZ로 변경하려면 "C"를 따르는 바이트에 글을 쓰거나 (본질적으로) 모든 것을 한 바이트로 오른쪽으로 이동시켜야합니다. 일반적인 이진 파일에서는 물건을 크게 엉망으로 만들 것입니다.

"ABC"의 바이트가 공백 또는 널 문자 인 경우 더 큰 교체 데이터를 작성하는 데 문제가 발생하지 않을 가능성이 높지만 여전히 .NET 문자열에서 ABC로 WXYZ로 대체 할 수는 없으므로 더 길게 만듭니다. ABC {ally_follows_it}을 WXYZ로 바꿔야합니다. 이를 감안할 때 데이터를 바이트로 남겨두고 한 번에 교체 데이터를 한 바이트 씩 작성하는 것이 더 쉽다는 것을 알 수 있습니다.

.NET 문자열이 유니 코드 문자열을 사용한다는 사실로 인해 사람들이 C에서했던 것처럼 더 이상 이것을 할 수 없습니다. 대부분의 경우, 심지어 심지어는 안됩니다. 시도 내용이 실제로 아닌 경우 String <-> 바이트 배열에서 앞뒤로 이동하려면 텍스트.

이 점을 명확하게해야합니다. .NET에서 byte[] 데이터는 아닙니다 텍스트, 그런 다음 그것을 string 스페셜을 제외하고 베이스 64 텍스트 채널을 통해 이진 데이터를 인코딩합니다. 이것은 .NET에서 일하는 사람들 사이에서 널리 사용되는 오해입니다.

당신의 문제는 당신이 바이트 배열을 비교하는 방식으로 보입니다.

Response.Write((fileData == recapturedBytes));

포함 된 값이 아니라 바이트 배열의 주소를 비교하기 때문에 항상 False가 반환됩니다. 문자열 데이터를 비교하거나 바이트 배열을 비교하는 방법을 사용하십시오. 대신 이것을 할 수 있습니다.

Response.Write(Convert.ToBase64String(fileData) == Convert.ToBase64String(recapturedBytes));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top