2013-05-30 6 views
0

Я работаю с SDK, который требует передачи кодека AVI в виде 8-значного внутреннего представления значения FourCC. Значение FourCC - WVC1, и я попытался преобразовать ASCII в соответствующие значения int для каждого символа, который, как я понял, будет 87864301, но это неверно.FourCC as int C#

Кто-нибудь знает, есть ли стандартный набор целочисленных значений, представляющих значения FourCC, или какой-либо способ его преобразования?

+0

ли эта помощь: http://msdn.microsoft.com/en-us/library/windows/desktop/dd375802(v=vs.85).aspx – DonBoitnott

ответ

2

http://msdn.microsoft.com/en-us/library/windows/desktop/dd375802(v=vs.85).aspx предлагает символы FOURCC должны быть шестнадцатеричными значениями и отменены перед преобразованием.

Вот пример консольного приложения, использующего их значения для YUY2 (WVC1 = 31435657). Обновленный код для включения конверсий большого и маленького числа endian и GUID.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace FourCC 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string fourCC = "YUY2"; 

      Console.WriteLine("Big endian value of {0} is {1}", fourCC, ConvertFourCC(fourCC, toBigEndian:true)); 
      Console.WriteLine("Little endian value of {0} is {1}", fourCC, ConvertFourCC(fourCC)); 
      Console.WriteLine("GUID value of {0} is {1}", fourCC, ConvertFourCC(fourCC, toGuid:true)); 
      Console.ReadKey(); 

     } 

     static string ConvertFourCC(string fourCC, bool toBigEndian = false, bool toGuid = false) 
     { 
      if (!String.IsNullOrWhiteSpace(fourCC)) 
      { 
       if (fourCC.Length != 4) 
       { 
        throw new FormatException("FOURCC length must be four characters");      
       } 
       else 
       { 
        char[] c = fourCC.ToCharArray(); 

        if (toBigEndian) 
        { 
         return String.Format("{0:X}", (c[0] << 24| c[1] << 16 | c[2] << 8 | c[3])); 
        } 
        else if (toGuid) 
        { 
         return String.Format("{0:X}", (c[3] << 24) | (c[2] << 16) | (c[1] << 8) | c[0]) + "-0000-0010-8000-00AA00389B71"; 
        } 
        else 
        { 
         return String.Format("{0:X}", (c[3] << 24) | (c[2] << 16) | (c[1] << 8) | c[0]); 
        } 
       } 
      } 
      return null; 
     } 
    } 
} 
+0

спасибо! это было очень полезно – user1934821