2012-03-30 35 views
1

我需要在與主機通信的C#應用​​程序中將字符串轉換爲具有偶校驗的7位ASCII碼。我嘗試使用,但是,它沒有正確的奇偶校驗。如何將字符串轉換爲具有偶校驗的7位ASCII碼?

+0

我已經使用UTF32 UTF7試過,UTF8 ,編碼和默認但不工作基本上要一個「,」字符轉換爲ox82 – ankush 2012-03-30 11:16:02

+0

這些是_all_ Unicode編碼。你可以嘗試'ASCII'編碼,儘管它是8位。 – Oded 2012-03-30 11:16:59

+0

你想要發生什麼非ASCII字符串? – 2012-03-30 11:17:22

回答

2

也許是這樣的:

public static byte[] StringTo7bitAsciiEvenParity(string text) 
{ 
    byte[] bytes = Encoding.ASCII.GetBytes(text); 

    for(int i = 0; i < bytes.Length; i++) 
    { 
     if(((((bytes[i] * 0x0101010101010101UL) & 0x8040201008040201UL) % 0x1FF) & 1) == 0) 
     { 
      bytes[i] &= 0x7F; 
     } 
     else 
     { 
      bytes[i] |= 0x80; 
     } 
    } 
    return bytes; 
} 

沒有經過充分測試。不要問我計算奇偶校驗的魔法是如何工作的。我只是found it here。但是這個的一些變體應該做你想要的。

我試圖讓','這個工作變成0x82。但我無法弄清楚應該怎麼做。在ASCII中,','是二進制00101100和0x82是二進制10000010.我根本沒有看到相關性。

+0

','應該變成'10101100b'或'0xAC'。 – user7116 2012-03-30 13:17:15

+0

@sixlettervariables好,那是我得到的。其餘的似乎與您鏈接的比價表匹配。順便說一句,我認爲你不清除非7位ASCII數據的最高位的方式可能比我所做的更好。 – 2012-03-30 14:27:02

+0

我認爲Encoding.ASCII的默認值會在非ASCII數據的情況下拋出異常。 – user7116 2012-03-30 15:45:09

2

你將不得不自己計算校驗位。因此:

  1. 使用內置的8位ASCII編碼將字符串轉換爲字節數組。使用這種編碼,最高位應該總是0。
  2. 對每個字節進行位修改併爲每個字節設置奇偶校驗位。

我知道沒有用於計算奇偶位的內置功能。

+0

[有點戲法可以幫忙。](http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel) – user7116 2012-03-30 11:52:11

1

假設字節級校驗和無端相關的行爲(即,字節流),下面的作品如預期(針對已知7-bit ASCII even parity table測試):

public static byte[] GetAsciiBytesEvenParity(this string text) 
{ 
    byte[] bytes = Encoding.ASCII.GetBytes(text); 

    for(int ii = 0; ii < bytes.Length; ii++) 
    { 
     // parity test adapted from: 
     // http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel 
     if (((0x6996 >> ((bytes[ii]^(bytes[ii] >> 4)) & 0xf)) & 1) != 0) 
     { 
      bytes[ii] |= 0x80; 
     } 
    } 

    return bytes; 
} 
相關問題