亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: kingink1983
打印 上一主題 下一主題

[C] 請教有關(guān)字符串輸出問題 [復制鏈接]

論壇徽章:
0
11 [報告]
發(fā)表于 2008-11-20 16:10 |只看該作者

回復 #9 yangsf5 的帖子

  1. static char* get_ucs2str(const uint16_t* inbuf, uint16_t inlen)
  2. {
  3.   char* outbuf = calloc(inlen, 2);
  4.   char* q;
  5.   int i;

  6.   if (!outbuf) {
  7.     mp_msg(MSGT_HEADER, MSGL_ERR, MSGTR_MemAllocFailed);
  8.     return NULL;
  9.   }
  10.   q = outbuf;
  11.   for (i = 0; i < inlen / 2; i++) {
  12.     uint8_t tmp;
  13.     PUT_UTF8(AV_RL16(&inbuf[i]), tmp, *q++ = tmp;)
  14.   }
  15.   return outbuf;
  16. }
復制代碼


這個是mplayer使用函數(shù),我直接粘貼過來的。

論壇徽章:
1
天蝎座
日期:2013-08-25 10:27:22
12 [報告]
發(fā)表于 2008-11-20 16:19 |只看該作者

回復 #11 kingink1983 的帖子

我只是粗略的看了下。

你自己先仔細看看,inbuf參數(shù)、PUT_UTF8宏。

看看宏P(guān)UT_UTF8在處理inbuf參數(shù)后有沒有在結(jié)尾放個'\0';
或者沒有放'\0',那就看看inbuf本身在結(jié)尾是否有'\0'。

論壇徽章:
1
天蝎座
日期:2013-08-25 10:27:22
13 [報告]
發(fā)表于 2008-11-20 16:23 |只看該作者
printf("Title: %s\n", string);


我的想法是,如果你這個string結(jié)尾沒有'\0',打印的就很有可能是亂碼。。
這個或許比你在樓頂?shù)恼f法更有說服力。

論壇徽章:
0
14 [報告]
發(fā)表于 2008-11-20 16:37 |只看該作者

回復 #12 yangsf5 的帖子

  1. /*!
  2. * \def PUT_UTF8(val, tmp, PUT_BYTE)
  3. * converts a 32-bit unicode character to its UTF-8 encoded form (up to 4 bytes long).
  4. * \param val is an input only argument and should be of type uint32_t. It holds
  5. * a ucs4 encoded unicode character that is to be converted to UTF-8. If
  6. * val is given as a function it's executed only once.
  7. * \param tmp is a temporary variable and should be of type uint8_t. It
  8. * represents an intermediate value during conversion that is to be
  9. * outputted by PUT_BYTE.
  10. * \param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
  11. * It could be a function or a statement, and uses tmp as the input byte.
  12. * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
  13. * executed up to 4 times for values in the valid UTF-8 range and up to
  14. * 7 times in the general case, depending on the length of the converted
  15. * unicode character.
  16. */
  17. #define PUT_UTF8(val, tmp, PUT_BYTE)\
  18.     {\
  19.         int bytes, shift;\
  20.         uint32_t in = val;\
  21.         if (in < 0x80) {\
  22.             tmp = in;\
  23.             PUT_BYTE\
  24.         } else {\
  25.             bytes = (av_log2(in) + 4) / 5;\
  26.             shift = (bytes - 1) * 6;\
  27.             tmp = (256 - (256 >> bytes)) | (in >> shift);\
  28.             PUT_BYTE\
  29.             while (shift >= 6) {\
  30.                 shift -= 6;\
  31.                 tmp = 0x80 | ((in >> shift) & 0x3f);\
  32.                 PUT_BYTE\
  33.             }\
  34.         }\
  35.     }
復制代碼

  1. static inline int av_log2(unsigned int v)
  2. {
  3.     int n;

  4.     n = 0;
  5.     if (v & 0xffff0000) {
  6.         v >>= 16;
  7.         n += 16;
  8.     }
  9.     if (v & 0xff00) {
  10.         v >>= 8;
  11.         n += 8;
  12.     }
  13.     n += ff_log2_tab[v];

  14.     return n;
  15. }
復制代碼
  1. const uint8_t ff_log2_tab[256]={
  2.         0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
  3.         5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  4.         6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  5.         6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  6.         7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  7.         7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  8.         7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  9.         7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
  10. };
復制代碼


這里就是get_ucs2str()所使用的所有的宏和函數(shù)等,沒有發(fā)現(xiàn)它給結(jié)尾加'\0'。原來的字符串也是有'\0'的。

我用編譯后的程序連接mms:地址時,就是通過調(diào)用asf_read_head() (in readhead.c file)將數(shù)據(jù)按照結(jié)構(gòu)的要求進行讀取,如果title,author等所有的內(nèi)容都存在的時候,則能和mplayer在控制臺中顯示的一樣,如果有些串的內(nèi)容不存在,就會出現(xiàn)亂碼,或者輸出信息類型不全問題。

通過分分析HEX分析文件,對于空和一般的字符用的長度不同

論壇徽章:
0
15 [報告]
發(fā)表于 2008-11-20 16:40 |只看該作者

回復 #13 yangsf5 的帖子

因為title指向的結(jié)構(gòu)的一個分量,它所指向的字符串應該不會出現(xiàn)問,最有可能的也就是最后一個rating分量指向的串有這個問題

論壇徽章:
0
16 [報告]
發(fā)表于 2008-11-20 16:57 |只看該作者

回復 #15 kingink1983 的帖子

  1. ///////////////////////////
  2. // ASF Content Description
  3. ///////////////////////////
  4. typedef struct  __attribute__((packed)) {
  5.   uint16_t title_size;
  6.   uint16_t author_size;
  7.   uint16_t copyright_size;
  8.   uint16_t comment_size;
  9.   uint16_t rating_size;
  10. } ASF_content_description_t;
復制代碼

這個結(jié)構(gòu)中的每個變量所附的值為其所對應的字符串的長度,這里讀取的串是pos的位置加上這個結(jié)構(gòu)的大。10)處開始的。原理不復雜,搞不定,汗……

my.JPG (3.5 KB, 下載次數(shù): 17)

我的程序輸出的信息

我的程序輸出的信息

2.jpg (9.39 KB, 下載次數(shù): 15)

讀到文件中的結(jié)構(gòu)和其指向的數(shù)據(jù)

讀到文件中的結(jié)構(gòu)和其指向的數(shù)據(jù)

3.jpg (3.03 KB, 下載次數(shù): 16)

mplayer的輸出信息

mplayer的輸出信息

論壇徽章:
1
天蝎座
日期:2013-08-25 10:27:22
17 [報告]
發(fā)表于 2008-11-20 21:07 |只看該作者
根據(jù)你的打印,len值跟文件中的那些字符串的長度+1相符么?

論壇徽章:
0
18 [報告]
發(fā)表于 2008-11-20 22:15 |只看該作者
原帖由 yangsf5 于 2008-11-20 21:07 發(fā)表
根據(jù)你的打印,len值跟文件中的那些字符串的長度+1相符么?

是當輸出內(nèi)容為空時,長度就是2,如果有內(nèi)容輸出的話,則字節(jié)的長度為輸出內(nèi)容的2倍(含結(jié)束符)。再有就是,我的出現(xiàn)亂碼,并缺少一項comments

[ 本帖最后由 kingink1983 于 2008-11-20 22:31 編輯 ]

論壇徽章:
1
天蝎座
日期:2013-08-25 10:27:22
19 [報告]
發(fā)表于 2008-11-20 22:36 |只看該作者

回復 #18 kingink1983 的帖子

你每次用len來表示相應內(nèi)容的長度的。
現(xiàn)在主要看你len的打印出來的長度是否跟文件中相應內(nèi)容的長度一致,如果不一致,就是你前邊解析文件的函數(shù)沒有正確工作。

如果不一致,你就要修改那個解析文件的函數(shù),并且保證解析出來的各內(nèi)容的的長度為文件中的實際字符串長度加1(這個加1是用來存儲'\0'的)。

另外要保證wstring = (uint16_t*)&hdr[pos];得到的wstring是c風格字符串。

論壇徽章:
0
20 [報告]
發(fā)表于 2008-11-20 22:40 |只看該作者

發(fā)一個有輸出內(nèi)容的

這個輸出 title:Traveling Night
author:Joel Hanson and Sara Groves

當然后面還有一項長度為3C長度個字符,和一個長度為2的“空”串吧

jite.jpg (30.98 KB, 下載次數(shù): 17)

jite.jpg
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP