2016-11-30 71 views
1

我更新我的问题,因为起初我认为我有最好的解决方案但是,直到现在我还没有。这是我在执行过程中的错误。我认为错误来自于文件C中的循环。我试图从文本文件“Plaintext.txt”中读取行。如何迭代python中的文本文件中的行?

e0370734313198a2885a308d3243f6a8 
ccddeeff8899aabb4455667700112233 
8e73b0f7da0e6452c810f32bc4567a22 

现在,它包含拖行,我把只有两个,为了使简单的测试,但我必须把更多的则1000名的文本(指超过1000线),我想读的每一行,然后将其发送到UART,我会为每一个明文做加密(加密算法是在C):这是我的脚本:

,你告诉我,但我仍然有一条线的加密我编辑

import string 
import serial 
import time 
from array import array 
import struct 
import binascii 

ser = serial.Serial(
        port='COM4',\ 
        baudrate=230400,\ 
        parity=serial.PARITY_NONE,\ 
        stopbits=serial.STOPBITS_ONE,\ 
        bytesize=serial.EIGHTBITS,\ 
        timeout=0) 

f = open(r'C:\\Users\\user\\Plaintxt.txt', 'r') 
for a in f: 
    plaintxt_16b=a[0:32] 
    plaintext=binascii.unhexlify(plaintxt_16b) 
    clear_msg=b'\x24'+b'\x73'+b'\x10'+plaintext 

ser.write(clear_msg) 
time.sleep(0.4) 

while True: 
    print(ser.read(70)) 
ser.close()    # close ports 

在C文件中:

while(1) 
    { 
     int rx_length = dev_uart_ptr->uart_read((void*)rx_buffer, 19); 

     if (rx_length <19) 
     { 

      if (rx_buffer[0]=='\x24') 
      { 
       if (rx_buffer[1]=='\x73') 
       { 
        if (rx_buffer[2]=='\x10') 
        { 
         plaintext[0] = (rx_buffer[3] << 24) | 
           (rx_buffer[4] << 16) | 
           (rx_buffer[5] << 8) | 
           rx_buffer[6]; 
         plaintext[1] = (rx_buffer[7] << 24) | 
           (rx_buffer[8] << 16) | 
           (rx_buffer[9] << 8) | 
           rx_buffer[10]; 
         plaintext[2] = (rx_buffer[11] << 24) | 
           (rx_buffer[12] << 16) | 
           (rx_buffer[13] << 8) | 
           rx_buffer[14]; 
         plaintext[3] = (rx_buffer[15] << 24) | 
           (rx_buffer[16] << 16) | 
           (rx_buffer[17] << 8) | 
           rx_buffer[18]; 

         xprintf("**************************\n"); 
         xprintf("%8x %8x %8x %8x \n",plaintext[0],plaintext[1],plaintext[2],plaintext[3]); 
         aes2_set_msg((unsigned int *)plaintext); /** Reset AES message buffer */ 
         aes2_set_key128((unsigned int *)key128); /** Put the key 128 into AES */ 
         /** Configure AES register to enable IRQ and ENCODE */ 
         regs_aes2_ptr-> CFG = AES2_CFG_ENC_DEC_BIT | AES2_CFG_IRQ_MASK_BIT; 
         /** Reset AES internaly */ 
         regs_aes2_ptr-> CTRL = AES2_CTRL_SWRESET_BIT; 

#if DEBUG 
         xprintf("Go encrypt..\n"); 
#endif 
         /** Start the ENCODE function */ 
         regs_aes2_ptr-> CTRL = AES2_CTRL_START_BIT; 

         while(!aes2_irq_flag); /** Wait for irq flag */ 
         aes2_irq_flag=0; /** Reset irq flag */ 

#if DEBUG 
         xprintf("Encrypt done..\n"); 
#endif 

         aes2_get_msg((unsigned int *)ciphertext); /** Retrieve encrypted message */ 
         xprintf("%8x %8x %8x %8x \n",ciphertext[0],ciphertext[1],ciphertext[2],ciphertext[3]); 
         xprintf("**************************\n"); 

        } 
        else 
        { 
         printf ("false"); 
        } 

       } 
       else 
       { 
        printf ("false"); 
       } 
      } 

     } 

    }// End While 

}//end of C_Entry 

所以问题是,它只需在最后一行,并重复所有的时间线相同的加密:

$************************** 
ccddeeff 8899aabb 44556677 112233 
Go encrypt.. 
Encrypt do 
ne.. 
d6e4d64b 27d8d055 c5c7573a 8df4e9aa 
************************** 
****************** 
******** 
ccddeeff 8899aabb 44556677 112233 
Go encrypt.. 
Encrypt done.. 
d6e4d64b 27d 
8d055 c5c7573a 8df4e9aa 
************************** 
************************** 
ccddeeff 
8899aabb 44556677 112233 
Go encrypt.. 
Encrypt done.. 
d6e4d64b 27d8d055 c5c7573a 8df 
4e9aa 
************************** 
************************** 
ccddeeff 8899aabb 44556677 
    112233 
Go encrypt.. 
Encrypt done.. 
d6e4d64b 27d8d055 c5c7573a 8df4e9aa 
********** 
**************** 
************************** 
ccddeeff 8899aabb 44556677 112233 
Go enc 
rypt.. 
Encrypt done.. 
d6e4d64b 27d8d055 c5c7573a 8df4e9aa 
.................... 

我会很感激,如果你能帮助我。

回答

0

的问题是在python文件空间:for循环必须包含

 ser.write(clear_msg) 
     time.sleep(0.4) 
     print(ser.read(70)) 

通过这种方式,它不会拿刚刚过去的明文来自明文文件。

import string 
import serial 
import time 
from array import array 
import struct 
import binascii 

ser = serial.Serial(
        port='COM4',\ 
        baudrate=230400,\ 
        parity=serial.PARITY_NONE,\ 
        stopbits=serial.STOPBITS_ONE,\ 
        bytesize=serial.EIGHTBITS,\ 
        timeout=0) 

f = open(r'C:\\Users\\user\\Plaintxt.txt', 'r') 
for a in f: 
    plaintxt_16b=a[0:32] 
    plaintext=binascii.unhexlify(plaintxt_16b) 
    clear_msg=b'\x24'+b'\x73'+b'\x10'+plaintext 
    ser.write(clear_msg) 
    time.sleep(0.4) 
    print(ser.read(70)) 
ser.close()    # close ports 

我的问题已解决。非常感谢您的帮助。

2

您可能需要做如下:

f = open("your_file", "r") 
for line in f: 
    do_something(line) 
f.close() 

或评论指出:

with open("your_file", "r") as f: 
    for line in f: 
     do_something(line) 

Python将每一行遍历这里给线变线串。你可以用这种方式处理文件中的每一行。另外,这样做,python每次读取一行,所以对于较大的文件是有效的。

+1

我个人使用'open(“your_file”,“r”)作为f:for line in f:do_something(line)'。这样可以避免在例外情况下无法关闭文件。 –

+0

@DaanTimmer我同意。我个人不经常使用“with”关键词,但这是一个更好的做法。 – Musen

+0

我很抱歉,它只有一次,然后我回来加密一行 – nani92

0

在你的for循环

for a in range (0,2): 

    line_array=lines[a] 
    plaintxt_16b=line_array[0:32] 

    plaintext=binascii.unhexlify(plaintxt_16b) 
    clear_msg=b'\x24'+b'\x73'+b'\x10'+plaintext 

您覆盖在每个迭代变量clear_msg。 一旦你离开循环它包含最后一个值。在你的情况下,最后一行(加密)。然后您几次发送变量clear_msg而不更改其内容。 您需要缩进以下块,以及:

print(clear_msg) 
ser.write(clear_msg) 
time.sleep(0.4) 
+0

删除了评论,误读'readline' readlines' –

+0

No. readlines()返回所有行的列表。 – jonie83

+0

是的,我知道;-)只是认为它说readline ;-)而不是readline_s_ –

0

this,调用readlines方法()使你的代码速度较慢,更明确,不够简明,对于绝对没有好处。

一个好的方法来打开一个文件,而不需要关闭它是通过使用while

with open(file) as f: 
    line = f.read().splitlines() 

line是包含文件的所有行的列表。您可以迭代,并得到任何条目,你会在列表中做

+0

它给我错误的分界线,它就像它不能读取任何线 – nani92

+0

什么样的错误。分裂线是为了确保你不会得到'\ n'字符。 –

+0

对不起,这是我的一个语法错误,但它仍然只给我一行。 – nani92

相关问题