Python中的大二进制代码到文件中

时间:2016-09-17 05:21:56

标签: python file binary

我一直在研究一个程序,我一直在尝试转换一个大的二进制文件(作为一个字符串)并将其打包成一个文件。我已经尝试了好几天才能做到这一点。这是我编写的用于打包大型二进制字符串的代码。

namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesResources;
use Illuminate\Contracts\Validation\Validator;
class Controller extends BaseController
{
    use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;

    protected function formatValidationErrors(Validator $validator)
    {
        $res = $validator->errors()->all();
        if(\Request::wantsJson())
        {
            $res = ["flag" => 0,
                    "msg" => $validator->errors()->first()];
            $res['data'] = $validator->errors()->all();
        }
        return $res;
    }
}

我留下了错误

binaryRecieved="11001010101....(Shortened)"
f=open(fileName,'wb')
m=long(binaryRecieved,2)
struct.pack('i',m)
f.write(struct.pack('i',m))
f.close()
quit()

我的整数超出范围,所以我想知道是否有不同的解决方法。

由于

3 个答案:

答案 0 :(得分:1)

将您的位字符串转换为字节字符串:例如,请参阅此问题Converting bits to bytes in Python。然后使用struct.pack('c', bytestring)

打包字节

答案 1 :(得分:1)

对于以big-endian顺序编码m(例如" ten"写为" 10"在正常小数使用中)使用:

def as_big_endian_bytes(i):
    out=bytearray()
    while i:
        out.append(i&0xff)
        i=i>>8
    out.reverse()
    return out

以小端顺序编码m(例如"十"写为" 01"正常小数使用时)使用:

def as_little_endian_bytes(i):
    out=bytearray()
    while i:
        out.append(i&0xff)
        i=i>>8
    return out

这两个函数都可以处理数字 - 就像你在问题中所做的那样 - 所以返回的bytearray可能比预期的要短(因为对于前导零的数字并不重要)。

对于二进制数字字符串的精确表示(只有当其长度可以被8分割时才可以),您必须这样做:

def as_bytes(s):
    assert len(s)%8==0
    out=bytearray()
    for i in range(0,len(s)-8,8):
        out.append(int(s[i:i+8],2))
    return out

答案 2 :(得分:0)

struct.pack {}}}中,您使用过' i'它表示一个有限的整数。正如您的代码所述,您的输出很长;因此,您可能想要使用' d'而不是将我的数据打包为双倍。它应该工作。

有关详细信息,请参阅Python struct